php regex для соответствия вне html-тегов

Я делаю preg_replace на странице html. Мой шаблон предназначен для добавления окружающего тега к некоторым словам в html. Однако иногда мое регулярное выражение изменяет теги html. Например, когда я пытаюсь заменить этот текст:

<a href="example.com" alt="yasar home page">yasar</a> 

Так что yasar читает <span class="selected-word">yasar</span> , мое регулярное выражение также заменяет yasar в атрибуте alt тэга anchor. Current preg_replace() Я использую выглядит так:

 preg_replace("/(asf|gfd|oyws)/", '<span class=something>${1}</span>',$target); 

Как я могу сделать регулярное выражение, чтобы оно не соответствовало чему-либо внутри тега html?

Related of "php regex для соответствия вне html-тегов"

Вы можете использовать для этого утверждение, поскольку вам просто нужно убедиться, что искомые слова произойдут после a > или перед любым < . Последний тест легче выполнить, так как прогнозные утверждения могут быть переменной длиной:

 /(asf|foo|barr)(?=[^>]*(<|$))/ 

См. Также http://www.regular-expressions.info/lookaround.html для объяснения синтаксиса утверждения.

Ясар, воскресив этот вопрос, потому что у него было другое решение, о котором не упоминалось.

Вместо того, чтобы просто проверять, что следующий тег-тег является открывающим тегом, это решение пропускает все <full tags> .

Со всеми отказами об использовании regex для синтаксического анализа html, вот регулярное выражение:

 <[^>]*>(*SKIP)(*F)|word1|word2|word3 

Вот демонстрация . В коде это выглядит так:

 $target = "word1 <a skip this word2 >word2 again</a> word3"; $regex = "~<[^>]*>(*SKIP)(*F)|word1|word2|word3~"; $repl= '<span class="">\0</span>'; $new=preg_replace($regex,$repl,$target); echo htmlentities($new); 

Вот демо-версия этого кода.

Справка

  1. Как сопоставить шаблон, за исключением ситуаций s1, s2, s3
  2. Как сопоставить шаблон, если …

Это может быть то, что вам нужно: http://snipplr.com/view/3618/ В общем, я бы посоветовал против такого. Лучшей альтернативой является выделение всех HTML-тегов и, вместо этого, использование BBcode, например:

 [b]bold text[b] [i]italic text[i] 

Однако я ценю, что это может не сработать с тем, что вы пытаетесь сделать.

Другим вариантом может быть очистка HTML, см. http://htmlpurifier.org/

С моей точки зрения, это должно работать:

 echo preg_replace("/<(.*)>(.*)<\/(.*)>/i","<$1><span class=\"some-class\">$2</span></$3>",$target); 

Но я не знаю, насколько это безопасно. Я просто представляю возможность 🙂