Соответствие с preg_match_all

Я получил это регулярное выражение:

$val = "(123)(4)(56)"; $regex = "^(\((.*?)\))+$"; preg_match_all("/{$regex}/", $val, $matches); 

Может ли кто-нибудь рассказать мне, почему это соответствует только последнему номеру (56), а не каждому набору номеров в отдельности?

Это то, что $ matches содержит после выполнения следующего регулярного выражения:

 array 0 => array 0 => string '(123)(4)(56)' (length=12) 1 => array 0 => string '(56)' (length=4) 2 => array 0 => string '56' (length=2) 

Поскольку @develroot уже ответил так, как вы хотите использовать preg_match_all он не будет работать, он вернет только последнюю сопоставимую группу, а не все записи этой группы. Так работает регулярное выражение. На данный момент я не знаю, как получить все групповые сочки в PHP, я предполагаю, что это невозможно. Может быть, не так, может измениться.

Однако вы можете обойти это для своего случая, прежде всего, проверить, соответствует ли вся строка вашей (повторяющейся) схеме, а затем извлекает совпадения по этому шаблону. Поместите все в одну функцию, и она легко доступна ( Demo ):

 $tests = explode(',', '(123)(4)(56),(56),56'); $result = array_map('extract_numbers', $tests); print_r(array_combine($tests, $result)); function extract_numbers($subject) { $number = '\((.*?)\)'; $pattern = "~^({$number})+$~"; if (!preg_match($pattern, $subject)) return array(); $pattern = "~{$number}~"; $r = preg_match_all($pattern, $subject, $matches); return $matches[1]; }