Манипулировать абзацами HTML в php

Возможный дубликат:
Выделите ключевые слова в абзаце

Вот еще один вопрос для вас. У меня небольшая проблема в php, и я подумал, прежде чем сам найти необычное решение, возможно, будет более простой и быстрый способ решения проблемы.

Предполагая, что у меня есть строка, содержащая теги абзаца HTML, такие как:

$string="<p>Hello this is nick</p>
         <p>i need some help over here</p>
         <p></p><p>Does anyone know a solution</p>"

И массив укусов, который содержит несколько слов "ключ":

$array=("Hello","nick", "help", "anyone", "solution")

Теперь я хотел бы сделать следующее: Вывести $string в браузере, но слова "подсказки" должны иметь специальный формат, например, жирный или выделенный.

Что делает меня немного сложным, так это то, что я хочу сохранить абзацы такими, какие есть. Другими словами, я хочу, чтобы окончательный результат выглядел точно так же, как оригинал (включая новые строки / новые абзацы), но с некоторыми словами, выделенными жирным шрифтом

Я думал, что мог бы использовать strip_tags, чтобы удалить <p> а также </p> теги, а затем разделить возвращенную строку пробелами. Чтобы получить массив слов. Затем я выводил бы каждое слово отдельно, проверяя, содержится ли это слово в $array, Если да, то он будет выведен жирным шрифтом.

Таким образом, я явно теряю понятие новых параграфов, и все параграфы будут объединены в один.

Есть ли простой способ это исправить? Например, способ узнать, что, например, слово "Hello" начинается в новом абзаце? Или я могу что-то еще сделать?

3 ответа

Просто замените слова отформатированными версиями самих себя. Приведенное ниже регулярное выражение поддерживает регистр и заменяет только полные слова (так, например, в слове "сникер" слово "ник" внутри него не заменяется).

preg_replace( '/\b('.implode( '|', $array ).')\b/i', '<em>$1</em>', $string );

Используйте str_replace и замените слова жирным шрифтом вокруг них

Почему бы просто не заменить ваши ключевые слова напрямую?

$string = str_ireplace(array('hello', 'nick'), array('<strong>hello</strong>', '<strong>nick</strong>'), $string);

(конечно, второй массив, переданный функции, будет сгенерирован заранее)

Другие вопросы по тегам