これは、正規表現パターンのみでは不可能です。これは、正規表現エンジンにすべての「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
Intl 拡張機能のが必要です。他の同様の音訳または翻訳機能に置き換えることができます。
ここで使用することはお勧めできませんstr_replace
。変換テーブルにフォールバックする必要がある場合は、strtr
代わりに使用してください。それがあなたが探しているものです。しかし、私は独自の翻訳を提供するライブラリを好みます。特にそれが Intl ライブラリの場合、通常はこれに勝るものはありません。