问题描述
我一直在尝试将句子中的搜索词加粗。如果句子是 Engliš is spoken wörldwide.
如果我的搜索词是 spoken world
我想得到 Engliš is <b>spoken wörld</b>wide.
我用过这个功能:
function highlightWords($text,$searchTerm){
$corr = ['a' => '[aäâ]','o' => '[oöòóôõ]','c' => '[cç]','s' => '[şśšșŝ]','y' => '[ýÿŷȳy]','o' => '[ôöòóøōoõ]','n' => '[ñńňn]','u' => '[üu]'];
$key = preg_quote($searchTerm);
$pattern = '/' . strtr($key,$corr) . '/iu';
$text = preg_replace($pattern,'<b>$0</b>',$text);
return $text;
}
它应该可以工作,但我得到了非常奇怪的行为。几个例子是:
文本是 Sygmaý çykdy deşdi-sähra düzünden
(抱歉,奇怪的句子)。当 $searchTerm
为 duz
时,它完美运行,我得到 Sygmaý çykdy deşdi-sähra <b>düz</b>ünden
。如果我将搜索词更改为 sahra
,该函数将仅返回简单的 Sygmaý çykdy deşdi-sähra düzünden
。
适用于 cykdy
和 çykdy
。
但不适用于 sygmay
和 sygmaý
。但适用于带大写字母的 Sygmaý
。
解决方法
函数中有几个问题,特别是在 $corr
数组中。
首先,有两个“o”部分,它们是不同的。这些需要结合起来。其次,无重音字母必须在每个字母的数组中。 s 没有这个,缺少的“s”是导致这个特殊失败的原因。
固定功能:
function highlightWords($text,$searchTerm)
{
$corr = [
'a' => '[aäâ]','o' => '[oöòóôõøō]','c' => '[cç]','s' => '[sşśšșŝ]','y' => '[yýÿŷȳ]','n' => '[nñńň]','u' => '[uü]'
];
$key = preg_quote($searchTerm);
$pattern = '/' . strtr($key,$corr) . '/iu';
$text = preg_replace($pattern,'<b>$0</b>',$text);
return $text;
}
$input = 'Sygmaý çykdy deşdi-sähra düzünden';
$term = 'sahra';
$expected = 'Sygmaý çykdy deşdi-<b>sähra</b> düzünden';
$highlighted = highlightWords($input,$term);
assert($highlighted == $expected,'Term should be marked bold');
echo $highlighted . PHP_EOL;