我正在增强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);
答案 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的区域设置。如果您的页面中有混合语言,则可以找到有效的通用国际语言环境。