Highlight text, except html tags

前端 未结 3 517
抹茶落季
抹茶落季 2021-01-18 06:26

I\'m using the code below to highlight some keywords in a text:

$message = str_ireplace($words,\'\'.$words.\'

        
相关标签:
3条回答
  • 2021-01-18 07:06

    Better code based on reply from @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);
    
    0 讨论(0)
  • 2021-01-18 07:17

    Use a DOM parser of some sort. This is not something you want to do with regex.

    0 讨论(0)
  • 2021-01-18 07:20

    From 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.

    Applied to your example, it would give something like this:

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

    Enjoy! ;)

    0 讨论(0)
提交回复
热议问题