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. Текущий preg_replace()
Я использую выглядит так:
preg_replace("/(asf|gfd|oyws)/", '<span class=something>${1}</span>',$target);
Как я могу сделать регулярное выражение, чтобы оно не соответствовало чему-либо внутри тега html?
Ответы
Ответ 1
Вы можете использовать для этого утверждение, так как вам просто нужно убедиться, что искомые слова произойдут после >
или перед любым <
. Последний тест легче выполнить, поскольку прогнозные утверждения могут быть переменной длиной:
/(asf|foo|barr)(?=[^>]*(<|$))/
См. также http://www.regular-expressions.info/lookaround.html для приятного объяснения этого синтаксиса утверждения.
Ответ 2
Ясар, воскресив этот вопрос, потому что у него было другое решение, которое не упоминалось.
Вместо того, чтобы просто проверять, что следующий символ тега является открывающим тегом, это решение пропускает все <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);
Вот онлайн-демонстрация этого кода.
Ссылка
Ответ 3
Это может быть то, что вам нужно: http://snipplr.com/view/3618/
В общем, я бы посоветовал против такого. Лучшей альтернативой является выделение всех HTML-тегов и, вместо этого, использование BBcode, например:
[b]bold text[b] [i]italic text[i]
Однако я ценю, что это может не сработать с тем, что вы пытаетесь сделать.
Другим вариантом может быть очистка HTML, см. http://htmlpurifier.org/
Ответ 4
С моей точки зрения, это должно работать:
echo preg_replace("/<(.*)>(.*)<\/(.*)>/i","<$1><span class=\"some-class\">$2</span></$3>",$target);
Но я не знаю, насколько это безопасно. Я просто представляю возможность:)