加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP搜索文本突出显示功能

发布时间:2020-12-13 21:44:44 所属栏目:PHP教程 来源:网络整理
导读:我有一个 PHP突出显示功能,使某些单词变粗. 下面是函数,它很有用,除非数组:$words包含单个值:b 例如,有人搜索:jessie j price tag feat b o b 这将在数??组$words中包含以下条目:jessie,j,price,tag,feat,b,o,b 当’b’出现时,我的整个函数出错了,它显示
我有一个 PHP突出显示功能,使某些单词变粗.

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

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

这将在数??组$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);

将输出:

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

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

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

解决方法

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

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

$string = 'jessie j price tag feat b o b';
$words = array('jessie','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);
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读