Html etiketleri hariç, metni vurgulayın

2 Cevap php

Ben bir metinde bazı anahtar sözcükleri vurgulamak için aşağıdaki kodu kullanıyorum:

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

Metin, bazı html etiketleri, örneğin, <img>, <strong>, vb içerebilir.

Nasıl html etiketleri arasındaki metin dışında, "normal" metni vurgulayabilirsiniz? Kullanıcılar "img" için arama <img> metin vurgulanır ve görüntü artık çalışmıyor çünkü.

2 Cevap

Çeşit bir DOM ayrıştırıcı kullanın. Bu regex ile yapmak istediğim bir şey değil.

Dan 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);
}

When $flag == 1, the replacement function is applied outside HTML. When $flag == -1, the replacement function is applied inside HTML.

Sizin örnekte uygulanan, böyle bir şey vermek istiyorum:

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

Tadını çıkarın! ;)