2014-10-28 152 views
2

我试图找出一个字符串使用preg_match_all有双引号之间的任何话,但它的复制结果与第一个结果具有两组双引号两侧,其中作为字符串被搜索只拥有一组。preg_match_all为什么会返回两个匹配项?

这里是我的代码:

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

而且VAR转储产生:

array(2) { 
    [0]=> 
    array(1) { 
     [0]=> 
     string(17) ""Test match this"" 
    } 
    [1]=> 
    array(1) { 
     [0]=> 
     string(15) "Test match this" 
    } 
} 

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

+0

离开了括号,或添加一些括号,阅读手册,你会解决它 – 2014-10-28 11:01:03

+0

请定义*错*。这不符合你的期望http://php.net/preg_match_all给出了什么? – hakre 2014-10-28 11:07:25

+1

由于您没有定义错误,因此您可能会在这里混淆var_dump的输出? – hakre 2014-10-28 11:14:38

回答

5

嗨,如果您正在使用vardump的print_r的,而不是你会看到一个更好的方式上存在差异。

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

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

) 

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

+0

对,没有意识到preg_match_all都返回了,谢谢。 – Styphon 2014-10-28 11:15:07

9

它返回2个元素,因为:

0捕获整个匹配的字符串

元素1..N捕获专用火柴。

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

(?<=")[^"]+(?=") 

这将捕获完全一样的,但在这种情况下,你不需要额外的捕获组。

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

+0

这不会产生我期望的结果,它包括结束字符串 - https://eval.in/210849 – Styphon 2014-10-28 11:12:48

+0

@Avinash Raj:请您澄清一下您的观点吗? – zerkms 2014-10-28 11:13:26

+0

@Styphon:提示:'(?=“)' – zerkms 2014-10-28 11:14:29

相关问题