2013-05-21 218 views
0

我有這樣的事情preg_match_all匹配陣列

$matches = array(); 
preg_match_all('/(`.+`)(\s+AS\s+`.+`)?/i', '`foo` AS `bar`', $matches); 
print_r($matches); 

結果是

Array 
(
[0] => Array 
    (
     [0] => `foo` AS `bar` 
    ) 

[1] => Array 
    (
     [0] => `foo` AS `bar` 
    ) 

[2] => Array 
    (
     [0] => 
    ) 

) 

所以,問題是,爲什麼我沒有「爲'bar`」在$matches[2][0]? (如果我刪除從正則表達式的符號「?」,我會得到它,但我需要的「?」 :))

+0

你可以只添加「U」的模式修飾符(在用「I」結尾),您似乎假設每個量詞非貪婪。 –

回答

2

量詞像+是由默認的貪婪,所以如果第一個可匹配一切它會這樣做。使其非貪婪應該做的工作:

preg_match_all('/(`.+?`)(\s+AS\s+`.+`)?/i', '`foo` AS `bar`', $matches); 

順便說一下,$matches = array();是沒有必要的 - 變量只寫入由preg_match_all所以它並不需要初始化/定義。

php > preg_match_all('/(`.+?`)(\s+AS\s+`.+`)?/i', '`foo` AS `bar`', $matches); 
php > print_r($matches); 
Array 
(
    [0] => Array 
     (
      [0] => `foo` AS `bar` 
     ) 

    [1] => Array 
     (
      [0] => `foo` 
     ) 

    [2] => Array 
     (
      [0] => AS `bar` 
     ) 

) 
+0

該死的..你打敗了我:-)良好和徹底的解釋順便說一句。 –