【问题标题】:php preg_math_all matches wrong stringphp preg_math_all 匹配错误的字符串
【发布时间】:2013-10-26 04:15:57
【问题描述】:

我有这个子模式:

<?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
        )

)

【问题讨论】:

    标签: php regex preg-match preg-match-all


    【解决方案1】:

    这里有什么问题?为什么要捕获额外的不相关字符串?

     #(?<=wav=").+?(?=")#
                ^^^
             This is the reason, it matches everything including the space and the "
    

    你可能想要:

    #(?<wav=")\w+(?=")#
    

    【讨论】:

    • 这成功了!谢谢你!
    • @Dannyboy 不客气,请不要忘记接受答案。
    • @Casimir et Hippolyte ?标记用于不贪婪的比赛恕我直言。是不是默认不贪心?
    • @CasimiretHippolyte 不错的观察,我忘了。
    • @Dannyboy 不,默认情况下它不是非贪婪的,但 \w 不会匹配 " 所以不需要一次处理一个字符。
    【解决方案2】:

    要解决问题,您可以将.+? 替换为[^"]+,例如:

     preg_match_all('#(?<=wav=")[^"]+(?=")#', $wavs, $matches);
    

    【讨论】:

      【解决方案3】:

      + 修饰符更改为*

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

      preg_match_all('#(?<=wav=")[^"]+(?=")#', $wavs, $matches);   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        相关资源
        最近更新 更多