Вставьте код для вставки только вместо URL, которые не находятся в href - PullRequest
1 голос
/ 23 октября 2019

Я настраиваю модуль на веб-сайте 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>

В этом целомpost body, модуль соответствует 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-адреса изтекст, который находится между кавычками (исправлена ​​половина проблемы)

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

1 Ответ

1 голос
/ 23 октября 2019

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

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

См. aдемо на regex101.com .

...