我正在增强我们的视频搜索页面,以突出显示搜索结果中的搜索字词.因为用户可以输入judas priest并且视频中包含Judas Priest文本,所以我必须使用正则表达式来保留原始文本的大小写.
我的代码有效,但我遇到特殊字符的问题š, ? and ž,似乎Preg_Replace()只有在情况相同时才会匹配(尽管有/ui修饰符).我的代码:
$Content = Preg_Replace ( '/\b(' . $term . '?)\b/iu', '<span class="HighlightTerm">$1</span>', $Content );
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
$Content = Mb_Eregi_Replace ( '\b(' . $term . '?)\b', '<span class="HighlightTerm">\\1</span>', $Content );
Run Code Online (Sandbox Code Playgroud)
但它也行不通.如果搜索词是"SREČA",它将匹配"SREČA",但如果搜索词是"sreča",则它将不匹配(反之亦然).
那我该怎么做呢?
更新:我设置了语言环境和内部编码:
Mb_Internal_Encoding ( 'UTF-8' );
$loc = "UTF-8";
putenv("LANG=$loc");
$loc = setlocale(LC_ALL, $loc);
Run Code Online (Sandbox Code Playgroud)
我觉得现在真的很蠢,但问题不在于Preg_*功能.我不知道为什么,但我首先检查给定的术语是否在字符串中,StriPos并且由于该函数不是多字节安全的,false如果文本的情况与搜索术语不同,则返回它,因此Preg_Replaceisn甚至打来电话.
因此,这里要学习的教训是,如果你有UTF8字符串,总是使用多字节版本的函数.