我一直在尝试将句子中的搜索词加粗。如果句子是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;
关于php - 使用 preg_replace 突出显示带重音的搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68306948/