Preg_Replace和UTF8

时间:2010-01-14 09:26:19

标签: php regex utf-8

我正在增强video search page以突出显示结果中的搜索字词。由于用户可以在其文本中输入judas priest并且视频中包含Judas Priest,因此我必须使用正则表达式来保留原始文本的大小写。

我的代码有效,但我对š, č and ž这样的特殊字符有疑问,似乎Preg_Replace()只有在情况相同的情况下才会匹配(尽管/ui修饰符)。 我的代码:

$Content = Preg_Replace ( '/\b(' . $term . '?)\b/iu', '<span class="HighlightTerm">$1</span>', $Content );

我也试过这个:

$Content = Mb_Eregi_Replace ( '\b(' . $term . '?)\b', '<span class="HighlightTerm">\\1</span>', $Content );

但它也行不通。如果搜索词是“SREČA”,它将匹配“SREČA”,但如果搜索词是“sreča”则不匹配(反之亦然)。

那我该怎么做呢?

更新:我设置了区域设置和内部编码:

Mb_Internal_Encoding ( 'UTF-8' );
$loc = "UTF-8";
putenv("LANG=$loc");
$loc = setlocale(LC_ALL, $loc);

3 个答案:

答案 0 :(得分:6)

我觉得现在真的很蠢,但问题不在于Preg_ *功能。我不知道为什么,但我首先检查给定的术语是否在StriPos的字符串中,并且因为该函数不是多字节安全的,所以如果文本的情况不是,则返回false与搜索词相同,因此甚至没有调用Preg_Replace

因此,这里需要学习的教训是,如果你有UTF8字符串,总是使用多字节版本的函数。

答案 1 :(得分:3)

不确定你的问题源于什么,但我只是将这个小测试用例放在一起:

<?php

$uc = "SREČA";

mb_internal_encoding('utf-8');
echo $uc."\n";
$lc = mb_strtolower($uc);
echo $lc."\n";

echo preg_replace("/\b(".preg_quote($uc).")\b/ui", "<span class='test'>$1</span>", "test:".$lc." end test");

它在我的机器上输出:

SREČA
sreča
test:<span class='test'>sreča</span> end test

似乎工作正常?

答案 2 :(得分:2)

如果我没弄错,preg_match使用当前的语言环境。尝试使用setting the locale这些字符所属的语言。您可能也需要基于utf8的区域设置。如果您的页面中有混合语言,则可以找到有效的通用国际语言环境。

另请参阅:http://www.phpwact.org/php/i18n/utf-8