且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PHP preg_place:以不区分大小写/变音符号的方式突出显示与关键字匹配的整个单词

更新时间:2022-04-24 23:02:29

一个想法是将键转换为模式,用字符类替换所有有问题的字符:

$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类:NormalizerTransliterator

注意:如果要突出显示多个关键点,请在一次操作中完成所有操作。按长度对数组进行排序(首先使用mb_strlen对最长的数组进行排序),使用array_map将键音译为ascii,然后使用|对数组进行内爆。目标是获得模式:'/(?:' . implode('|', $keys) . ')/iu'bj[oòóôõö]rn k[aàáâãäå]llstr[oòóôõö]mbj[oòóôõö]rn之前(例如)。