Я использую код ниже для выделения некоторых ключевых слов в тексте:
$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message);
Текст может содержать некоторые теги HTML, например <img>
, <strong>
, и т.д.
Как я могу выделить "нормальный" текст, кроме текста между тегами HTML? Поскольку, когда пользователи ищут "img" <img>
текст будет выделен, и изображение больше не работает.
Используйте какой-нибудь парсер DOM. Это не то, что вы хотите делать с регулярным выражением.
Из http://forum.phpfrance.com/vos-contributions/remplacement-selectif-hors-dans-balises-html-t199.html
function mon_rplc_callback($capture){
global $arg;
return ($arg['flag'] == 1)
? $arg['fct']($arg['from'], $arg['to'], $capture[1]).$capture[2]
: $capture[1].$arg['fct']($arg['from'], $arg['to'], $capture[2]);
}
function split_tag($from, $to, $txt, $fct, $flag = 1){
global $arg;
$arg = compact('from', 'to', 'fct', 'flag');
return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $txt);
}
Когда $ flag == 1, функция замены применяется вне HTML. Когда $ flag == -1, функция замены применяется внутри HTML.
Применительно к вашему примеру это будет примерно так:
echo split_tag($words, '<span class="hightlighted_text">'.$words.'</span>', $message, 'str_ireplace', 1);
Наслаждайтесь! ;)