PHP preg_replace: highlight whole words matching a key in case/diacritic-insensitive way(PHP preg_place:以不区分大小写/变音符号的方式突出显示与关键字匹配的整个单词)
本文介绍了PHP preg_place:以不区分大小写/变音符号的方式突出显示与关键字匹配的整个单词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要在UTF-8$文本中突出显示与$key匹配的单个单词或短语(整个单词,而不是子字符串)。这样的匹配必须既不区分大小写又不区分变音符号。突出显示的文本必须保持原样(包括大写/小写字符和变音符号(如果存在))。
以下表达式实现了一半的目标:
$text = preg_replace( "/($key)/i", '<div class="highlight">$1</div>', $text );
它不区分大小写,并匹配整个单词,但如果与$key匹配的$text部分包含$key中不存在的变音符号,则不会突出显示这些部分。
例如,我希望在$TEXT PASSING$KEY="Bjorn Kallstrom"中突出显示"Björn Källström"。
欢迎任何好主意(使用preg_place或其他PHP函数)。
推荐答案
一个想法是将键转换为模式,用字符类替换所有有问题的字符:
$corr = ['a' => '[aàáâãäå]', 'o' => '[oòóôõö]',/* etc. */];
$key = 'bjorn kallstrom';
$pattern = '/' . strtr($key, $corr) . '/iu';
$text = preg_replace($pattern, '<em class="highlight">$0</em>', $text);
请注意,由于您处理的是Unicode字符,因此需要使用u修饰符来避免意外行为,特别是在单词边界方面。
如果您的密钥已包含重音字符,请先将其转换为ASCII:
$key = 'björn kallstrom';
$key = iconv('UTF-8', 'ASCII//TRANSLIT', $key);
(如果您获得?
而不是字母,这意味着您的区域设置设置为C或POSIX。在本例中,将它们更改为en_US.UTF-8或系统中另一个可用的值。请参见setlocale)
还要看一下非常有用的intl类:Normalizer和Transliterator。
注意:如果要突出显示多个关键点,请在一次操作中完成所有操作。按长度对数组进行排序(首先使用mb_strlen
对最长的数组进行排序),使用array_map
将键音译为ascii,然后使用|
对数组进行内爆。目标是获得模式:'/(?:' . implode('|', $keys) . ')/iu'
,bj[oòóôõö]rn k[aàáâãäå]llstr[oòóôõö]m
在bj[oòóôõö]rn
之前(例如)。
这篇关于PHP preg_place:以不区分大小写/变音符号的方式突出显示与关键字匹配的整个单词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:PHP preg_place:以不区分大小写/变音符号的方式突出显示与关键字匹配的整个单词


猜你喜欢
- 如何从数据库中获取数据以在 laravel 中查看页面? 2022-01-01
- openssl_digest vs hash vs hash_hmac?盐与盐的区别HMAC? 2022-01-01
- 覆盖 Magento 社区模块控制器的问题 2022-01-01
- 如何在 Symfony2 中正确使用 webSockets 2021-01-01
- PHP foreach() 与数组中的数组? 2022-01-01
- Oracle 即时客户端 DYLD_LIBRARY_PATH 错误 2022-01-01
- 如何使用 Google API 在团队云端硬盘中创建文件夹? 2022-01-01
- Laravel 5:Model.php 中的 MassAssignmentException 2021-01-01
- PHP - if 语句中的倒序 2021-01-01
- 使用 GD 和 libjpeg 支持编译 PHP 2022-01-01