Вставляйте код вставки только вместо URL-адресов, которые не находятся в href
Я настраиваю модуль на веб-сайте 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

23.10.2019 10:26:56
Правильный ответ будет включать в себя использование парсера.
Для более взломанного решения вы можете использовать (*SKIP)(*FAIL)
в регулярном выражении, например
<a[^>]*>[^<]*</a>(*SKIP)(*FAIL)|https?:\S+
Смотрите демонстрацию на regex101.com .



<
/>
в любом месте якорного текста / атрибута.
