Regex немного над моей головой, но я пытаюсь учиться.
У меня есть рабочее регулярное выражение, которое я использую в preg_replace, чтобы соответствовать строке и заменить ее ссылкой html. Он правильно избегает, когда совпадения находятся внутри тегов привязки, если в теге привязки нет дочернего тега.
Здесь (обновленный) шаблон:
/(?!(?:[^<]+>|[^>]+<\/a>))\b(Match Me)\b/is
И некоторый образец текста:
<a href="#">Don't Match Me <span>web</span></a>
<a href="#">Don't Match Me</a>
Match Me
<span>Match Me</span>
Вышеупомянутое регулярное выражение будет соответствовать тексту на 1-й, 3-й и 4-й строках. Тем не менее, я хочу только совместить текст "Match Me" на 3-й и 4-й строках.
ПРИМЕЧАНИЕ. Содержимое, которое я просеиваю, не просто разделяется линиями, как в моем примере. Это абзац текста.
Я открыт для использования DOM, но я беру большой блок контента и применяю несколько замен, используя функцию массива preg_replace, например:
preg_replace($searchFor, $linkArray, $content);
где $ searchFor и $ linkArray - это многомерные массивы с соответствующими ключами, содержащими шаблон и замену html соответственно.
Любая помощь приветствуется!
Совпадение HTML довольно сложно с регулярным выражением. В принятом ответе здесь не учитываются строки, где совпадение находится между двумя отдельными тегами привязки, например:
HTML:
<a href="#">Don't Match Me <span>web</span></a>
match me
<a href="#">Don't Match Me</a>match me<a href="#">Don't Match Me</a>
Раньше я использовал следующее regex, но это будет работать только в php: https://regex101.com/r/v0FfFC/1
/<a[^>]*>(?:[a-zA-Z0-9\s'\-\.,]|(?:<(.*)>.*<\/\1>))*<\/a>(*SKIP)(*FAIL)|\b(match me)\b(?=[^>]*(?:<|$))/gi
<a href="#">Don't Match Me</a> match me <a href="#">Don't Match Me</a>
совпадение находится между двумя тегами привязки, т. <a href="#">Don't Match Me</a> match me <a href="#">Don't Match Me</a>
Я изменил ваше регулярное выражение, чтобы найти якоря и избежать выбора этой строки.
/^(?!.*(\<a.*?\>)).*$/ism