国际案例不敏感的搜索和替换

时间:2015-01-15 01:21:54

标签: php regex

我有一个显示搜索结果的PHP页面。搜索不区分大小写。例如,用户可以在任何情况下搜索单词“FÖR”。一个相应的匹配是文本“ögaföröga”。找到匹配项后,我想显示匹配项,但使用CSS对其进行不同的着色。我当前的解决方案有行preg_match_all("/$needle+/i", $haystack, $matches);,它执行不区分大小写的正则表达式搜索。它适用于拉丁字符但不适用于国际字符。特别是,我使用瑞典语,希腊语和希伯来语字符。我怎样才能做到这一点?示例代码:

private function highlightStr($needle, $haystack) {
     // return $haystack if there are no strings given, nothing to do.
    if (strlen($haystack) < 1 || strlen($needle) < 1) {
        return $haystack;
    }
    preg_match_all("/$needle+/i", $haystack, $matches);
    if (is_array($matches[0]) && count($matches[0]) >= 1) {
        foreach ($matches[0] as $match) {
            $haystack = str_replace($match, '<span class="searchHighlight">'.$match.'</span>', $haystack);
        }
    }
    return $haystack;
}

搜索示例:FÖR

示例匹配:öga för öga

期望的结果:öga <span class="searchHighlight">för</span> öga

编辑:当我将代码更改为

时,我就开始工作了
preg_match_all("/\b{$needle}\b/ui", $haystack, $matches);
if (is_array($matches[0]) && count($matches[0]) >= 1) {
    $unique = array_count_values($matches[0]);
    foreach ($unique as $match => $value) {
        $haystack = preg_replace("/\b{$match}\b/ui", '<span class="searchHighlight">'.$match.'</span>', $haystack);
    }
}
/ui参数中的

preg_replace指定使用 U nicode,并且 I nsensitive。 (\b指定单词边界)

1 个答案:

答案 0 :(得分:2)

要在php中进行搜索和替换,您可以使用:

$result = preg_replace('/FÖR/ui', '<span class="searchHighlight">$0</span>', $text);

要在php中使用正则表达式匹配Unicode字母,您可以使用:\ p {L}
文本是否与正则表达式匹配html-escape,如f&ouml;r中所示?如果是,您必须在\ p {L}匹配之前取消它。