Я просто искал решение той же задачи и создал решение, которое, похоже, справится с этой задачей.
Отрицательный взгляд - это ключ.
Чтобы убедиться, что совпадение не находится внутри тега, посмотрите вперед и убедитесь, что закрывающая угловая скобка не найдена до открывающей. Предположим, мы хотим найти слово «игла»:
#needle(?![^<]+>)#i
Мой случай написан на PHP и выглядит примерно так:
function filter_highlighter($content) {
$patterns = array(
'#needle(?![^<]+>)#i',
'#<b>Need</b>le#',
'#<strong>Need</strong>le#'
);
$replacement = '<span class="highlighted">Need</span>le';
$content = preg_replace( $patterns, $replacement, $content);
return $content;
}
Пока это работает.