0

私はこのようなものを持っています

$matches = array();
preg_match_all('/(`.+`)(\s+AS\s+`.+`)?/i', '`foo` AS `bar`', $matches);
print_r($matches);

結果は

Array
(
[0] => Array
    (
        [0] => `foo` AS `bar`
    )

[1] => Array
    (
        [0] => `foo` AS `bar`
    )

[2] => Array
    (
        [0] => 
    )

)

では、なぜ 'AS `bar`' が含まれていないの$matches[2][0]でしょうか? (正規表現から「?」記号を削除すると取得できますが、「?」が必要です:))

4

1 に答える 1

2

のような量+指定子はデフォルトで貪欲なので、最初のものがすべてに一致する場合はそうします。欲張らないようにすると、次のようになります。

preg_match_all('/(`.+?`)(\s+AS\s+`.+`)?/i', '`foo` AS `bar`', $matches);

ちなみに、必須で$matches = array();はありません-変数はによってのみ書き込まれるpreg_match_allため、事前に初期化/定義する必要はありません。

php > preg_match_all('/(`.+?`)(\s+AS\s+`.+`)?/i', '`foo` AS `bar`', $matches);
php > print_r($matches);
Array
(
    [0] => Array
        (
            [0] => `foo` AS `bar`
        )

    [1] => Array
        (
            [0] => `foo`
        )

    [2] => Array
        (
            [0] =>  AS `bar`
        )

)
于 2013-05-21T08:09:54.447 に答える