2

私はこのサブパターンを持っています:

<?php                                                                                                                                                                                                                                          

    $wavs = 'aaaa="" wav="d" bbbbb="" wav="gerg" ccccc="" wav="" ddddd=""';        
    preg_match_all('#(?<=wav=").+?(?=")#', $wavs, $matches);                    
    print_r($matches);                                                          
?> 

次の出力が得られます。

php test.php 
Array
(
    [0] => Array
        (
            [0] => d
            [1] => gerg
            [2] => " ddddd=
        )

)

私は2試合だけを期待していましたが:

php test.php 
Array
(
    [0] => Array
        (
            [0] => d
            [1] => gerg
        )

)

ここでの問題は何ですか?余分な無関係な文字列がキャプチャされているのはなぜですか?

編集: (M42 応答)

preg_match_all('#(?<=wav=").*?(?=")#', $wavs, $matches);  

それでも不正確な一致になります:

Array
(
    [0] => Array
        (
            [0] => d
            [1] => gerg
            [2] => 
            [3] => " ddddd=
        )

)

編集:(スニファー)

はい!ありがとうございます!正確に機能します。

preg_match_all('#(?<=wav=")\w+?(?=")#', $wavs, $matches);  

Array
(
    [0] => Array
        (
            [0] => d
            [1] => gerg
        )

)
4

3 に答える 3

3

+修飾子を*次のように変更します。

preg_match_all('#(?<=wav=").*?(?=")#', $wavs, $matches);   
//                        __^

また

preg_match_all('#(?<=wav=")[^"]+(?=")#', $wavs, $matches);   
于 2013-10-17T15:22:00.683 に答える
3

に置き換えることができる問題を解決するには.+?[^"]+例:

 preg_match_all('#(?<=wav=")[^"]+(?=")#', $wavs, $matches);
于 2013-10-17T15:23:36.083 に答える