为什么preg_match_all返回两个匹配?

Sty*_*hon 5 php regex duplicate-data preg-match-all

我试图确定一个字符串是否在双引号之间有任何单词preg_match_all,但它是重复结果,第一个结果有两组双引号,其中被搜索的字符串只有一组.

这是我的代码:

$str = 'Test start. "Test match this". Test end.';
$groups = array();
preg_match_all('/"([^"]+)"/', $str, $groups);
var_dump($groups);
Run Code Online (Sandbox Code Playgroud)

var转储产生:

array(2) {
    [0]=>
    array(1) {
        [0]=>
        string(17) ""Test match this""
    }
    [1]=>
    array(1) {
        [0]=>
        string(15) "Test match this"
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,第一个数组是错的,为什么要preg_match_all返回呢?

zer*_*kms 9

它返回2个元素,因为:

Element 0捕获整个匹配的字符串

元素1..N捕获专用匹配.

PS:表达同样的另一种方式可能是

(?<=")[^"]+(?=")
Run Code Online (Sandbox Code Playgroud)

这将捕获完全相同但在这种情况下,您不需要额外的捕获组.

演示:http://regex101.com/r/lF3kP7/1


小智 5

嗨,如果您使用的是print_r而不是vardump,您将会以更好的方式看到差异.

Array
(
    [0] => Array
        (
            [0] => "Test match this"
        )

    [1] => Array
        (
            [0] => Test match this
        )

)
Run Code Online (Sandbox Code Playgroud)

第一个包含整个字符串,第二个是您的匹配.