@ilall

Как подсветить слова в тексте?

Добрый день.

Есть текст (html с простейшей структурой - абзацы, форматирование текста, всё), нужно в нём подсветить (обернуть в span) слова по регулярному выражению.

Конечно есть очевидное решение проблемы в лоб:
$regex_to_wrap = [ ... ];
foreach( $regex_to_wrap as $regex ) {
  $text = preg_replace( $regex,  '<span>$0</span>', $text );
}


В таком варианте есть случаи, когда на выходе появляются вложенные/пересекающиеся теги, самое простое:
$regex_to_wrap = [ '/111/', '/11/' ];
$text = 'foo 111 bar';

/* ... */

$text = 'foo <span><span>11</span>1</span> bar';


В общем случае, нужно обернуть текст в span только если этот текст уже не обёрнут в какой-либо тег. Насколько я понимаю принцип, нужно через lookbehind смотреть на наличие открывающего тега, но моих знаний регулярных выражений не хватает на такие вещи.

Возможно, регулярки в принципе не подходят для такой задачи, и нужно использовать другой подход?
В голову приходит разбор дерева через DomDocument, фильтрация нод по DOMText, отбрасывая остальное, и замена только по ним. Нормальное ли это решение?
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 1
ematveev
@ematveev
PHP разработчик / руководитель / писатель
можно проще, проверять например наличие подстроки '<', есть ли наличие оборачивающего тега в тексте
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы