Добрый день.
Есть текст (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, отбрасывая остальное, и замена только по ним. Нормальное ли это решение?