Вставляйте код вставки только вместо URL-адресов, которые не находятся в href

Вставляйте код вставки только вместо URL-адресов, которые не находятся в href

23.10.2019 10:21:38 Просмотров 42 Источник

Я настраиваю модуль на веб-сайте drupal 8, где некоторые URL-адреса vimeo или youtube преобразуются во встроенные видеоролики iframe. Сам модуль отлично работает, однако возникает проблема, когда есть тег

<a href="https://vimeo.com/videoid">Some text</a>.

Тело столба может выглядеть примерно так:

    https://vimeo.com/id1   //this line should get replaced with embed code by module

    <a href="https://vimeo.com/id1"> Check out this video </a> //here, anything that is in href="" should not be replaced
on <a href="https://vimeo.com"> Vimeo </a>

В этом теле сообщения модуль соответствует url-адресу ( https://vimeo.com/id1 ) и затем использует функцию str_replace () для замены каждого url-адреса сгенерированным кодом встраивания.

$embed_code = $this->convertVimeoUrlToEmbedCode($url);
$return['text'] = str_replace($url, $embed_code, $return['text']);

До сих пор то, что я пытался сделать, было:

  • Поместите текст-заполнитель вместо url-адреса в теге href, затем замените все URL-адреса кодом внедрения, а затем поместите url-адрес обратно в заполнитель.
  • Удалите все URL-адреса из текста, которые находятся между кавычками (исправлена половина проблемы)

По сути, то, что я ищу, - это чистый способ замены $ URL-адресов кодом вставки, игнорируя $URL-адреса, которые находятся в кавычках или печатаются любым другим способом в тегах html

У вопроса есть решение - Посмотреть?

Ответы - Вставляйте код вставки только вместо URL-адресов, которые не находятся в href / Insert embed code only in place of urls that are not in href

Является ответом!
Jan

23.10.2019 10:26:56

Правильный ответ будет включать в себя использование парсера.
Для более взломанного решения вы можете использовать (*SKIP)(*FAIL)в регулярном выражении, например

<a[^>]*>[^<]*</a>(*SKIP)(*FAIL)|https?:\S+

Смотрите демонстрацию на regex101.com .

https://stackoverflow.com/questions/58529709/insert-embed-code-only-in-place-of-urls-that-are-not-in-href/58529772#comment103384147_58529772
Это, кажется, работает. Однако в некоторых случаях, когда тело сообщения имеет более одного url-адреса видео, каждый url-адрес get заменяется одним и тем же встроенным кодом. В этом регулярном коде я должен как-то заменить https?: расстаться с $url?
https://stackoverflow.com/questions/58529709/insert-embed-code-only-in-place-of-urls-that-are-not-in-href/58529772#comment103384229_58529772
Я изменил https?:\S + часть к url-адресу, и он работает. Я думаю, это не самое чистое решение, но о хорошо
https://stackoverflow.com/questions/58529709/insert-embed-code-only-in-place-of-urls-that-are-not-in-href/58529772#comment103384263_58529772
@MantasBagdonas: это не будет работать с вложенными ссылками (используйте парсер здесь) или </>в любом месте якорного текста / атрибута.
https://stackoverflow.com/questions/58529709/insert-embed-code-only-in-place-of-urls-that-are-not-in-href/58529772#comment103384518_58529772
Извините, не могли бы вы указать мне на какие-то источники, касающиеся парсера? Поскольку я не совсем уверен, что вы предлагаете, и я действительно не знаю, что искать
Закрыть X