Выделить текст, кроме HTML-тегов - PullRequest
6 голосов
/ 07 апреля 2010

Я использую код ниже, чтобы выделить некоторые ключевые слова в тексте:

$message = str_ireplace($words,'<span class="hightlighted_text">'.$words.'</span>',$message);

Текст может содержать некоторые html-теги, например <img>, <strong> и т. Д.

Как выделить «обычный» текст, кроме текста между тегами html? Потому что когда пользователи ищут «img», текст <img> будет выделен, и изображение больше не будет работать.

Ответы [ 3 ]

5 голосов
/ 07 апреля 2010

Использовать DOM-парсер какого-то рода. Это не то, что вы хотите сделать с регулярным выражением.

2 голосов
/ 07 апреля 2010

С 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);

Наслаждайтесь! ;)

0 голосов
/ 23 января 2018

Лучший код на основе ответа @Savageman

$str = '<a href="ba">ba</a>';
$highlightWhat = "ba";
$str = preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', function($m) use ($highlightWhat) {
            return preg_replace('~('.$highlightWhat.')~i', '<span style="background:#fff330">$1</span>', $m[1]) . $m[2];
        },
        $str);
...