4

正規表現のリストがあります:

suresnes|suresne|surenes|surene
pommier|pommiers
^musique$
^(faq|aide)$
^(file )?loss( )?less$
paris
faq                              <<< this match twice

私の使用例は、一致した各パターンがユーザーへのリンクを表示するため、複数のパターン マッチングを行うことができます。

これらのパターンを単純なテキスト文字列「パリに住む」/「よくある質問」/「ポム」に対してテストします...

これを行う簡単な方法は、 を使用してすべてのパターンをループするpreg_matchことですが、パフォーマンスが重要なページでこれを頻繁に行うので、これは見栄えが悪くなります

これが私が試したことです:これらすべての式をグループ名で1つに結合します:

preg_match("@(?P<group1>^(faq|aide|todo|paris)$)|(?P<group2>(paris)$)@im", "paris", $groups);

ご覧のとおり、各パターンはグループ化(?P<GROUPNAME>PATTERN)されており、すべてパイプで区切られてい|ます。

最初のグループ一致のみが返されるため、結果は期待したものではありません。一致が発生すると、解析が停止するように見えます。

私が欲しいのは、一致するすべてのグループのリストです。preg_match_allどちらも役に立ちません。

ありがとう!

4

3 に答える 3

1

このアプローチを試してください:

#/ define input string
$str_1 = "{STRING HERE}";

#/ Define regex array
$reg_arr = array(
'suresnes|suresne|surenes|surene',
'pommier|pommiers',
'^musique$',
'^(faq|aide)$',
'^(file )?loss( )?less$',
'paris',
'faq'
);

#/ define a callback function to process Regex array
function cb_reg($reg_t)
{
    global $str_1;
    if(preg_match("/{$reg_t}/ims", $str_1, $matches)){
    return $matches[1]; //replace regex pattern with the result of matching is the key trick here
    //or return $matches[0]; if you dont want to get captured parenthesized subpatterns
    //or you could return an array of both. its up to you how to do it.
    }else{
    return '';
    }
}

#/ Apply array Regex via much faster function (instead of a loop)
$results = array_map('cb_reg', $reg_arr); //returns regex results
$results = array_diff($results, array('')); //remove empty values returned

基本的に、これは私が考えることができる最速の方法です。

  1. たとえば、数百の正規表現を 1 つの呼び出しに結合することはできません。これは、構築する正規表現が非常に複雑になり、マッチングに失敗する可能性が何度かあるためです。これは、それを行うための最良の方法の 1 つです。

  2. 私の意見では、多数の Regex を 1 つの正規表現に結合する (可能であれば) は、 onpreg_matchのこのアプローチと比較して、 での実行が遅くなります。覚えておいてください、ここでの鍵は です。これは、 での同様の状況で配列を処理する最速の方法です。CallbackArraysCallback function on array member valuesphp

callback on ArrayTheは と等しくないことにも注意してくださいlooping the Array。ループは遅く、アルゴリズム分析からnがあります。ただし、配列要素のコールバックは内部であり、比較すると非常に高速です。

于 2013-04-24T20:58:56.397 に答える