Word Boundary Регулярное выражение, если внутри 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"> ( "синий" в этом случае является заполнителем для любого другого цвета в массиве, в котором я сравниваю его с).

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

Ответ 1

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

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

Ответ 2

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

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

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

Здесь demo

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

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

Ссылка