2013-05-21 4 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] => 
    ) 

) 

Таким образом, возникает вопрос, почему у меня нет 'AS `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

Черт .. ты избил меня к этому :-) Хорошее и полное объяснение кстати. –