【问题标题】:PHP Case Insensitive Word ReplacementPHP 不区分大小写的单词替换
【发布时间】:2010-06-17 22:20:01
【问题描述】:

好的,我正在尝试在我正在制作的这个搜索脚本中将搜索字词加粗,但我无法让它不区分大小写。

    function highlight($term,$target){
    $terms = explode(" ", $term);

    foreach($terms as $term){
        $result = (eregi_replace($term, "<strong>$term</strong>", $target));
    }
    return $result;
}

这是我到目前为止的功能。它在 PHP.net 上说 eregi_replace 是不区分大小写的匹配,但由于某种原因它显然不起作用。 (我是菜鸟)。

有什么想法吗? :D

【问题讨论】:

    标签: php


    【解决方案1】:

    ereg_*(POSIX 正则表达式)函数在 PHP 5.3 中是 deprecated,并且很长时间没有被推荐。最好使用PCREpreg_*)函数(如preg_replace)。

    您可以通过创建一个不区分大小写的正则表达式来做到这一点,然后将匹配项包装在&lt;strong&gt; 标签中:

    function highlight($term, $target)
    {
      $terms = array_unique(explode(" ", $term)); // we only want to replace each term once
      foreach ($terms as $term)
      {
        $target = preg_replace('/\b(' . preg_quote($term) . ')\b/i', "<strong>$1</strong>", $target);
      }
    
      return $target;
    }
    

    这样做是首先在您的$term 上调用preg_quote,这样如果术语中的正则表达式中存在任何有意义的字符,它们就会被转义,然后创建一个正则表达式来查找被包围的术语按单词边界(\b——这样如果这个词是“好”,它就不会匹配“再见”)。该术语用括号括起来,以使正则表达式引擎以其现有形式将术语捕获为“反向引用”(正则表达式引擎挂在匹配部分的一种方式)。通过指定i 选项使表达式不区分大小写。最后,它用&lt;strong&gt; 标签包围的相同反向引用替换任何匹配项。

    $string = "The quick brown fox jumped over the lazy dog. The quicker brown fox didn't jump over the lazy dog.";
    $terms = "quick fox";
    highlight($terms, $string);
    // results in: The <strong>quick</strong> brown <strong>fox</strong> jumped over the lazy dog. The quicker brown <strong>fox</strong> didn't jump over the lazy dog.
    

    如果您想要关于正则表达式的优秀教程,请查看regular-expressions.info 上的教程。

    【讨论】:

    • 如果用户搜索clockstr_ireplace 会将文本中的Clock 转换为clock。不是一个好的选择。
    • @Pekka,他要求进行不区分大小写的匹配,为什么这不是一个好选择。它就是这样做的..
    • @this 我认为他的声明非常明确:Ok I'm trying to make search terms bold in this search script I'm making
    • 我赞成第一个回答者提出一个完成的、基于 PCRE 的示例。 :)
    • 那么我能做些什么来解决这个问题呢?
    【解决方案2】:
    function highlight($term,$target)
    {
        $terms = explode(" ", $term);
    
        foreach($terms as $term){
            $target = (str_ireplace($term, "<strong>$term</strong>", $target));
        }
        return $target;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2013-10-19
      • 2010-10-29
      • 1970-01-01
      • 2017-02-24
      • 2014-02-16
      • 2015-08-30
      相关资源
      最近更新 更多