Манипулировать абзацами 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);
(конечно, второй массив, переданный функции, будет сгенерирован заранее)