Регулярное выражение границы слова, если только внутри тега HTML

У меня есть регулярное выражение, использующее границы слов, которое работает очень хорошо...

~\b('.$value.')\b~i

...за исключением того факта, что он соответствует тексту внутри тегов HTML (например, title="This is blue!"). Это проблема, потому что я делаю подстановку текста для всего, что соответствует регулярному выражению, а затем делаю всплывающие подсказки с помощью этих тегов title. Итак, как вы можете себе представить, это замена текста внутри заголовка и нарушение HTML всплывающей подсказки. Например, что должно быть:

<span class="blue" title="This is blue!">Aqua</span>

...в итоге становится...

<span class="blue" title="This is <span class=" blue"="">Royal Blue</span>"&gt;Aqua</span>

Мое использование strip_tags не решило проблему; Я думаю, что мне нужно лучшее регулярное выражение, которое просто не будет соответствовать содержимому, оканчивающемуся на blue"> («синий» в этом случае является заполнителем для любого другого цвета в массиве, с которым я его сравниваю).

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


person daveycroqet    schedule 17.06.2013    source источник
comment
Лучшим решением было бы использовать синтаксический анализатор DOM вместо регулярного выражения для анализа и изменения текста HTML.   -  person anubhava    schedule 17.06.2013
comment
Вы смотрели, например, DOMDocument? Я бы предложил прочитать несколько примеров и попытаться разобраться.   -  person Ja͢ck    schedule 17.06.2013
comment
Как предложил @anubhava, вы можете посмотреть здесь: developer.mozilla.org /en-US/docs/Web/API/DOMParser   -  person NeverHopeless    schedule 17.06.2013
comment
В любом случае... каким должен быть желаемый результат после замены?   -  person Pioneer Skies    schedule 04.07.2013


Ответы (2)


Замены регулярных выражений часто кажутся решением, но они могут иметь много вредных побочных эффектов и на самом деле не достигают того, чего вы хотите. Вместо этого посмотрите на модели DOMDocument (как предложили некоторые комментаторы).

Но если вы настаиваете на использовании регулярных выражений, здесь хороший пост о SO. Он использует два прохода, чтобы выполнить то, что вы хотите.

person Josh T    schedule 28.10.2013

Дэйви, воскрешаю этот вопрос, потому что помимо решения Dom есть лучшее решение для регулярных выражений, чем упомянутое до сих пор. Это простое решение, требующее одного шага.

Общее решение

<[^>]*>(*SKIP)(*F)|blue

Вот демонстрация

Любой контент внутри тегов <> просто пропускается. Содержимое между тегами, например синий, соответствует вашим потребностям.

В выражении замените «синий» на то, что вам нравится.

Справочник

  1. Как сопоставить шаблон, за исключением ситуаций s1, s2, s3
  2. Как сопоставить шаблон, если...
person zx81    schedule 12.05.2014
comment
Это абсолютно блестящее решение проблемы с использованием только RegEx. Я понятия не имел, что *SKIP существует. - person daveycroqet; 15.07.2014
comment
Да, это потрясающая функция, доступная только в Perl и PCRE (PHP, R, Delphi, N++...) - person zx81; 16.07.2014
comment
Я хотел бы дать вам ответ на этот вопрос, даже после всего этого времени, но похоже, что синтаксический анализ DOM по-прежнему является лучшей практикой. Но я ооочень люблю RegEx! - person daveycroqet; 16.07.2014
comment
Аррр, не хотел убирать ответ, просто упомянул эту функцию, но спасибо за мысль. :) Да, регулярное выражение потрясающее. :) - person zx81; 16.07.2014