php - 使用 preg_replace 突出显示重音搜索词
问题描述
我一直在尝试在句子中加粗搜索词。如果句子是Engliš is spoken wörldwide.
If my search term is spoken world
I want to getEngliš 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
,该函数将返回 plain 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;
推荐阅读
- python - 不同熊猫数据框的两列之间的部分单词匹配
- haskell - 如何在堆栈项目中使用我自己的 Haskell 库?
- android - 按下主页按钮后处理程序向死线程发送消息
- javascript - 如何在 Javascript 函数中隐藏或散列值?
- apache-camel - 如何设置 JMSCorrelationID 并将 JMSMessageID 与 Camel 客户端和 IBMMQ 代理相关联
- excel - 使用 VBA 进行 Google 翻译 - (Excel 宏)问题
- python - /1 处的 OperationalError 没有这样的列:auctions_comment.listing_id
- json - 如何在平面列表中呈现 XML 反应原生
- javascript - React.js 无限重新渲染
- oracle - Oracle Apex 20 - 甘特图如何隐藏不活动的日期和时间