2013-05-21 163 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

该死的..你打败了我:-)良好和彻底的解释顺便说一句。 –