2010-04-07 15 views
6

:Metin vurgulama, bir metinde bazı anahtar kelimeler vurgulamak için aşağıdaki kodu kullanıyorum

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

örnek <img>, <strong> için, bazı html etiketleri içerebilir metin, vb ..

Html etiketleri arasındaki metin dışında "normal" metni nasıl vurgulayabilirim? Kullanıcılar "img" için arama yaptıkları zaman <img> metni vurgulanacak ve görüntü artık çalışmaz.

+0

http://stackoverflow.com/questions/2590862/match-multiple-terms-within-body-tags/2590969#2590969 gelen cevap dayalı adil bir saat önce!) – bobince

cevap

5

Bir çeşit DOM ayrıştırıcısı kullanın. Bu regex ile yapmak istediğiniz bir şey değil.

2

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

itibaren $ bayrak == 1, yedek işlevi HTML dışında uygulandığı zaman. $ flag == -1 olduğunda, HTML içinde değiştirme işlevi uygulanır. senin örneğe Uygulanan

, böyle bir şeyi verecekti:

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

tadını çıkarın! ;)

+0

Teşekkürler, ama bu bir html ayrıştırıcısı yok. Yukarıdaki posterler, bu durumda bir html çözümleyicinin daha iyi olacağını söylemiştir (??) – Arjen

+0

Ve size normal ifadelerin çok iyi bir iş çıkartabileceğini söylüyorum. Ayrıca geçerli bir html koduna sahip olmanız gerekmeyecek: sadece işe yarayacak. – Savageman

+0

Cevabınız için teşekkür ederiz. Tek sorun, anahtar kelimelerin (vurgulanması gereken) tüm alfa sayısal karakterleri içerdiği zaman bir bellek sızıntısı hatası almasıdır. – Arjen

0

Daha iyi kod (@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); 
İlgili konular