PHP案例不敏感的单词替换

时间:2010-06-17 22:20:01

标签: php

好的我正在尝试在我正在制作的搜索脚本中使搜索字词变粗,除非我无法使其不敏感。

    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 个答案:

答案 0 :(得分:8)

从PHP 5.3开始,ereg_*(POSIX正则表达式)函数是deprecated,并且很长时间没有被建议。最好使用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 - 包围的那个术语 - 所以如果术语是“好的”它将不匹配“再见”)。该术语包含在括号中,以使正则表达式引擎将其现有形式中的术语捕获为“反向引用”(正则表达式引擎挂起到匹配部分的方式)。通过指定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 :(得分:0)

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

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