Redactor: Параметр Youtube iframe 'src' удален после сохранения записи

Созданный на 13 окт. 2020  ·  7Комментарии  ·  Источник: craftcms/redactor

Описание

Итак, я просто тестировал конфигурацию очистителя HTML по умолчанию, которая теперь позволяет правильно встраивать видео YouTube и не удаляет ее при сохранении записи, однако она все еще не работает должным образом. Я считаю, что это связано с тем, что регулярное выражение, используемое для определения того, является ли URL-адрес iframe src YouTube или vimeo, не совсем правильное и не учитывает крайний случай в URL-адресах YouTube, в которых опускается часть https: в начале URL-адрес.

Действия по воспроизведению

  1. Перейдите на YouTube и возьмите любой URL-адрес видео (например, https://www.youtube.com/watch?v=roY6H75d9wE).
  2. Используйте значок встраивания видео в редакторе, чтобы добавить указанное выше видео YouTube в редактор.
  3. Сохраните запись
  4. Вернитесь и отредактируйте ту же запись
  5. Вы увидите, что эскиз видео на YouTube исчез. Если вы посмотрите HTML-код в редакторе, то увидите, что сам iframe там, просто отсутствует параметр src.

Решение

Это происходит потому, что когда вы впервые вставляете видео с YouTube, полученный HTML-код выглядит следующим образом:

<figure><iframe style="width: 500px; height: 281px;" src="//www.youtube.com/embed/roY6H75d9wE" frameborder="0" allowfullscreen=""></iframe></figure>

Как видно выше, параметр src начинается с // вместо https://

В результате указанное выше значение src удаляется, потому что текущее используемое регулярное выражение не учитывает возможность отсутствия схемы:
https://github.com/craftcms/redactor/blob/2fff5171f89538e84921119e8af533e6379ad24b/src/Field.php#L1019

Вот регулярное выражение, которое я использовал в прошлом, которое работает с этим пограничным случаем:

'URI.SafeIframeRegexp' => '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',

Обратите внимание на дополнительные скобки и вопросительный знак вокруг части https?: обозначающие ее как необязательную. Он также учитывает URL-адреса nocookie на YouTube. Наконец, символы . (точка) также были экранированы, поскольку мы хотим, чтобы они соответствовали реальной точке, а не только любому символу.

Дополнительная информация

  • Версия крафта: 3.5.12.1
  • Версия PHP: 7.3
  • Драйвер и версия базы данных: pgsql 11
  • Плагины и версии: редактор 2.8.1

Все 7 Комментарий

Кроме того, я думаю, что эти символы . (точка) в регулярном выражении должны быть экранированы должным образом, поскольку цель состоит в том, чтобы сопоставить буквальный символ . а не какой-либо символ. Я обновил решение с регулярным выражением выше, чтобы избежать их.

@ andris-sevcenko просто проверяет, не замечали ли вы эту проблему. Спасибо.

@ sidm1983 У меня есть. Вы готовы предоставить для этого PR?

Только что выпустила 2.8.3, в которой это исправлено.

Просто обновил конфигурацию очистителя HTML по умолчанию для новых проектов Craft. Вам нужно будет внести это изменение вручную, если у вас есть файл config/htmlpurifier/Default.json : https://github.com/craftcms/craft/commit/2e3710956cd6d8f8a1ac572a2b10c53e714f1799

Спасибо за это @ andris-sevcenko & @brandonkelly. Извините, я не отправил PR по этому поводу, так как в то время у меня не было шанса. Спасибо, что разобрались.

@brandonkelly , быстрый вопрос об изменении, которое вы внесли в вышеуказанный коммит. Похоже, что символы точки не экранируются, что означает, что они будут соответствовать любому символу, а не только одной точке. Это намеренно?

@brandonkelly просто хотел проверить, видели ли вы мой комментарий выше об экранировании символа точки в регулярном выражении. Спасибо. 😊🙏🏽

Была ли эта страница полезной?
0 / 5 - 0 рейтинги