【问题标题】:Ignore short characters and specific words in search highlight function忽略搜索突出显示功能中的短字符和特定单词
【发布时间】:2012-12-11 11:11:01
【问题描述】:

我这里有关键字“加粗”功能:

$ignore = array ('div', 'class', 'high', 'light', 'highlight');
$keywords = explode(' ', $qsvarus);
$title[$key] = preg_replace('/'.implode('|', $keywords).'/i', '<b>$0</b>', $title[$key]);
$infoo[$key] = preg_replace('/'.implode('|', $keywords).'/i', '<b>$0</b>', $infoo[$key]);

问题是它有时会捕获我的一些 html 标签。当&lt;b&gt;&lt;/b&gt; $keywords 时,如何告诉它忽略 $ignore 数组中少于 3 个字母和某些特定单词的所有内容?

【问题讨论】:

    标签: php regex preg-replace explode implode


    【解决方案1】:

    我会先简单地循环关键字数组,删除忽略数组中的所有匹配项(使用 in_array)以及任何 3 个字符或更少字符的关键字。

    那么如果你想确保你不在一个标签中,以下应该就足够了:

    /\b(keyword|keyword|keyword)\b(?![^<]*[>])/
    

    我基本上附加了一个否定的前瞻:

    (?![^<]*[>])
    

    只要前面没有打开标签&lt; 的结束html &gt; 不匹配,正则表达式就会匹配。如果你确实得到了一个结束标签,你应该能够*假设你在一个标签内。

    将其放回 preg_replace:

    preg_replace('/\b('.implode('|', $keywords).')\b(?![^<]*[>])/i', '<b>$1</b>', $subject);
    
    • 这确实假设没有大于 (&gt;) 的未编码

    【讨论】:

    • 出现错误:警告:preg_replace() [function.preg-replace]:编译失败:lookbehind 断言在偏移量 12 处不是固定长度。如果在使用其他 12 个项目执行此功能时使用它。这就是为什么我使用 $key :)
    • 抱歉,我忘记了后向断言需要固定长度。你可以用前瞻来做同样的事情。我将编辑我的答案。
    • 至于你的 foreach 循环 - 如果没有更多代码,我无法真正想象你想要做什么;是否为每个键定义了关键字?如果不是,那么您只想循环删除其他 foreach 循环之外的忽略和
    • 当然,另一种选择是使用preg_replace_callback,并且仅当它不在忽略数组中或> 3个字符时有条件地将粗体标签应用于替换?
    • 谢谢,现在没有错误,但它仍然匹配 html 标签 :( 例如 fi theres heyword 它突出显示
      中的 div。可能是正则表达式有问题?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多