PHP搜索文本突出显示功能

Mr.*_*oon 3 php highlight

我有一个PHP突出显示功能,使某些单词变粗.

下面是函数,它很有用,除非数组:$ words包含单个值:b

例如,有人搜索:jessie j price tag feat bob

这将在数​​组$ words中包含以下条目:jessie,j,price,tag,feat,b,o,b

当'b'出现时,我的整个函数出错了,它显示了一大堆错误的html标签.当然,我可以从数组中去掉任何'b'值,但这并不理想,因为突出显示不适用于某些查询.

此示例脚本:

    function highlightWords2($text, $words)
    {
        $text =  ($text);
        foreach ($words as $word)
        {       
            $word = preg_quote($word);

            $text = preg_replace("/\b($word)\b/i", '<b>$1</b>', $text);

        }
        return $text;
    }


$string = 'jessie j price tag feat b o b';

$words = array('jessie','tag','b','o','b');

echo highlightWords2($string, $words);
Run Code Online (Sandbox Code Playgroud)

将输出:

<<<b>b</b>><b>b</b></<b>b</b>>>jessie</<<b>b</b>><b>b</b></<b>b</b>>> j price <<<b>b</b>><b>b</b></<b>b</b>>>tag</<<b>b</b>><b>b</b></<b>b</b>>> feat <<b>b</b>><b>b</b></<b>b</b>> <<b>b</b>>o</<b>b</b>> <<b>b</b>><b>b</b></<b>b</b>>
Run Code Online (Sandbox Code Playgroud)

这只会发生,因为数组中有"b".

你能看到我能改变的任何东西让它正常工作吗?

Jos*_*nge 5

你的问题是,当你的功能通过并查找所有b为粗体时,它会看到粗体标签,并尝试加粗它们.

@symcbean很接近但忘了一件事.

$string = 'jessie j price tag feat b o b';
$words = array('jessie','tag','b','o','b');

print hl($string, $words);

function hl($inp, $words)
{
  $replace=array_flip(array_flip($words)); // remove duplicates
  $pattern=array();
  foreach ($replace as $k=>$fword) {
     $pattern[]='/\b(' . $fword . ')(?!>)\b/i';
     $replace[$k]='<b>$1</b>';
  }
  return preg_replace($pattern, $replace, $inp);
}
Run Code Online (Sandbox Code Playgroud)

你是否看到这添加了"(?!>)",这是一个负面的前瞻断言,基本上它表示只有在字符串后面没有">"时才会匹配,这将是打开粗体并关闭粗体标签.注意我只检查字符串后面的">",以便排除开始和结束粗体标记,因为在字符串的开头查找它不会捕获关闭粗体标记.上面的代码完全按预期工作.