2014-10-28 76 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

相關問題