php正则表达式搜索无论特殊字符

时间:2014-07-04 03:01:05

标签: php regex

我不是一个正则表达的人,我不擅长。但我可以请求帮助。因为我有一个示例代码。我想改进它。

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


$string = "The amazing spider-man";
$terms = "spider man";
echo highlight($terms, $string);

当我尝试输入蜘蛛侠时。有用。蜘蛛侠怎么样?我想搜索它甚至字符串有蜘蛛侠。是否可以使用术语蜘蛛侠搜索它?

我试过spider.man。有效。但蜘蛛侠没有

1 个答案:

答案 0 :(得分:0)

放宽单词匹配模式以允许连字符出现在搜索字符串的任何中点涉及在每个搜索词的每个字符之间添加可选的连字符(-? 表示零或一个连字符)。

这将适用于您的示例数据,但当您希望进一步扩展可选字符列表时,该模式的长度会增加。您可以自行决定限制匹配中可能出现的字符。

记得在 preg_quote() 调用中声明模式分隔符。

代码:(Demo)

function highlight(string $term, string $target): string
{
    $words = [];
    foreach (array_unique(explode(" ", trim($term))) as $word) {
        $chars = [];
        foreach (str_split($word) as $char) {
            $chars[] = preg_quote($char, '/');
        }
        $words[] = implode('-?', $chars);
    }

    $pattern = '/\b(?:' . implode('|', $words) . ')\b/i';
    // echo "$pattern\n";

    return preg_replace($pattern, "<strong>$0</strong>", $target);
}

$string = "The amazing spider-man";
$terms = " amaze spiderman";
echo highlight($terms, $string);

生成的模式:

/\b(?:a-?m-?a-?z-?e|s-?p-?i-?d-?e-?r-?m-?a-?n)\b/i

输出:

The amazing <strong>spider-man</strong>