PHP регулярное выражение для соответствия вне HTML-тегов - PullRequest
7 голосов
/ 25 октября 2011

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

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

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

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

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

Ответы [ 4 ]

20 голосов
/ 25 октября 2011

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

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

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

7 голосов
/ 15 мая 2014

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

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

Со всеми заявлениями об отказе от использования регулярных выражений для анализа 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. Как сопоставить шаблон, если ...
0 голосов
/ 25 октября 2011

По моему мнению, это должно работать:

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

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

0 голосов
/ 25 октября 2011

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

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

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

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

...