仅使用正则表达式模式这是不可能的。这并不是因为您无法告诉正则表达式引擎匹配所有“e”和类似的内容。但是,可以首先对输入数据(数组和搜索输入)进行标准化,然后搜索标准化数据,但返回非标准化数据的结果。
在下面的示例中,我使用音译来进行这种标准化,我想这就是您正在寻找的:
$data = ['Napoléon', 'Café'];
$result = array_translit_search('le', $data);
print_r($result);
$result = array_translit_search('leó', $data);
print_r($result);
示例性输出是:
Array
(
[0] => Napoléon
)
Array
(
[0] => Napoléon
)
搜索功能本身相当简单,如上面所写,音译输入,执行preg_grep
然后返回原始输入匹配:
/**
* @param string $search
* @param array $data
* @return array
*/
function array_translit_search($search, array $data) {
$transliterator = Transliterator::create('ASCII-Latin', Transliterator::REVERSE);
$normalize = function ($string) use ($transliterator) {
return $transliterator->transliterate($string);
};
$dataTrans = array_map($normalize, $data);
$searchTrans = $normalize($search);
$pattern = sprintf('/%s/i', preg_quote($searchTrans));
$result = preg_grep($pattern, $dataTrans);
return array_intersect_key($data, $result);
}
这段代码需要Transliterator从国际分机 http://php.net/class.transliterator,您可以将其替换为任何其他类似的音译或翻译功能。
我不建议使用str_replace
顺便说一句,如果您需要回退到转换表,请使用strtr http://php.net/strtr反而。这就是您要寻找的。但我更喜欢一个自带翻译的库,特别是如果它是 Intl 库,你通常无法击败它。