我正在增强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);
最佳答案
我现在真的很愚蠢,但是问题根本就不在Preg_ *函数上。我不知道为什么,但是我首先检查了给定术语是否在带有StriPos
的字符串中,并且由于该函数不是多字节安全的,因此如果文本的大小写与搜索术语不同,则返回false
,所以甚至没有调用Preg_Replace
。
因此,这里要吸取的教训是,如果您具有UTF8字符串,请始终使用多字节版本的函数。