我有一个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".
你能看到我能改变的任何东西让它正常工作吗?
你的问题是,当你的功能通过并查找所有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)
你是否看到这添加了"(?!>)",这是一个负面的前瞻断言,基本上它表示只有在字符串后面没有">"时才会匹配,这将是打开粗体并关闭粗体标签.注意我只检查字符串后面的">",以便排除开始和结束粗体标记,因为在字符串的开头查找它不会捕获关闭粗体标记.上面的代码完全按预期工作.