2010-01-14 56 views
3

我正在加强我们的video search page以突出显示搜索结果中的搜索项。因为用户可以在文本中输入judas priest,并且视频中有Judas Priest,我必须使用正则表达式来保留原始文本的大小写。Preg_Replace和UTF8

我的代码工作,但我有特殊字符,如š, č and ž的问题,看来,如果情况是相同的(尽管/ui修改)Preg_Replace()将只匹配。 我的代码:

$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); 
+0

您是否考虑过如果用户在搜索查询中输入特殊字符(如'/'或'*')会发生什么? – 2010-01-14 09:30:28

+0

搜索词在我做任何事之前都已经过消毒。感谢评论。 – 2010-01-14 09:31:42

+0

而不是“消毒”,你可以使用'preg_quote' – troelskn 2010-01-14 10:03:56

回答

6

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

所以这里学到的教训是,如果你有UTF8字符串,总是使用多字节版本的函数。

+1

阿门,兄弟。阿门。 – 2016-06-21 15:01:44

2

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

参见:http://www.phpwact.org/php/i18n/utf-8

+0

请参阅我的问题的更新。 – 2010-01-14 10:11:59

+1

在任何系统上,UTF-8可能都不是有效的语言环境。尝试在shell上运行locale -a来获取支持的语言环境。你可能想要一个看起来像'en_GB.utf8'的。 – troelskn 2010-01-14 10:16:32

+0

谢谢。我已将其更改为'sl_SI.UTF-8',但结果相同... – 2010-01-14 10:20:18

2

不知道你的问题是从所产生的,但我只是把一起这个小测试案例:

<?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 

似乎正常工作?

+0

添加'mb_regex_encoding'没有解决问题(我已经有另外两个):\ – 2010-01-14 10:26:42

+0

mb_strtolower正确地转换字符 – 2010-01-14 10:32:18