PHP不区分大小写的单词替换

4

我正在制作一个搜索脚本,希望将搜索关键词加粗显示,但我无法实现不区分大小写的搜索。

    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

2个回答

9
ereg_*(POSIX正则表达式)函数已经自PHP 5.3版本起被弃用,并且长期以来一直没有建议使用。更好的方法是使用PCREpreg_*)函数(例如preg_replace)。
您可以通过创建不区分大小写的正则表达式,然后在匹配项中添加<strong>标签来实现:
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)包围的该术语(这样如果术语是“good”,它将不匹配“goodbye”)。术语被括在括号中,以使正则表达式引擎以其现有形式捕获该术语作为“反向引用”(一种让正则表达式引擎保留匹配部分的方法)。通过指定选项i来使表达式不区分大小写。最后,它用相同的反向引用包围<strong>标签替换任何匹配项。
$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上的教程。

1
如果用户搜索了“clock”,则str_ireplace将把文本中的“Clock”替换为“clock”。这不是一个好的选择。 - Pekka
@Pekka,他要求不区分大小写匹配,为什么这不是一个好的选择。它确实可以做到这一点。 - Juan Cortés
我认为他正在发表非常清晰的陈述:“好吧,我正在尝试让这个搜索脚本中的搜索词变成粗体”。 - Pekka
我会给第一个展示出基于PCRE的完整示例的回答者点赞。 :) - Pekka
那我可以做什么来应对这个问题? - zuk1
用数组仅调用一次preg_replace()会快得多。 - mgutt

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接