3

用語で構成される配列があり、それらのいくつかにはアクセント付き文字が含まれています。私はこのようなpreggrepを行います

$data= array('Napoléon','Café');
$result = preg_grep('~' . $input . '~i', $data);

したがって、ユーザーが「le」と入力した場合、結果の「Napoléon」も一致させる必要があります。これは、abloveコマンドでは機能しません。

いくつか検索したところ、この関数が関連している可能性があることがわかりました

preg_match("/[\w\pL]/u",$var);

これらを組み合わせて機能させるにはどうすればよいですか?

4

2 に答える 2

3

これは、正規表現パターンのみでは不可能です。これは、正規表現エンジンにすべての「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);
}

このコードにはTransliteratorIntl 拡張機能のが必要です。他の同様の音訳または翻訳機能に置き換えることができます。

ここで使用することはお勧めできませんstr_replace。変換テーブルにフォールバックする必要がある場合は、strtr代わりに使用してください。それがあなたが探しているものです。しかし、私は独自の翻訳を提供するライブラリを好みます。特にそれが Intl ライブラリの場合、通常はこれに勝るものはありません。

于 2012-12-28T17:11:43.617 に答える
1

あなたはこのようなものを書くことができます:

$data = array('Napoléon','Café');
// do something with your input, but for testing purposes it will be simply as you wrote in your example
$input = 'le';

foreach($data as $var) {
  if (preg_match("/".str_replace(array("é"....), array("e"....), $input)."/i", str_replace(array("é"....), array("e"....), $var))) 
    //do something as there is a match
}

実際、この場合は正規表現は必要ありません。単純なstrposもので十分です。

于 2012-12-28T16:50:14.677 に答える