使用 preg_replace 突出显示带重音的搜索词
Highlighting an accented search term using preg_replace
我一直在尝试将句子中的搜索词加粗。如果句子是 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>[=11=]</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
,函数 returns 就是普通的 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>[=10=]</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;
我一直在尝试将句子中的搜索词加粗。如果句子是 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>[=11=]</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
,函数 returns 就是普通的 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>[=10=]</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;