Поскольку @develroot уже ответил, как вы хотите использовать preg_match_all
не работает, он вернет только последнюю соответствующую группу, а не все записи этой группы. Вот как работает регулярное выражение. На данный момент я не знаю, как получить все групповые выражения в PHP, я предполагаю, что это невозможно. Может быть не прав, может измениться.
Однако вы можете обойти это для своего случая, сначала проверив, соответствует ли вся строка вашему (повторному) шаблону, а затем извлекая совпадения по этому шаблону. Поместите все это в одну функцию, и она легко доступна ( Демо ):
$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];
}