Соответствует preg_match_all - PullRequest
0 голосов
/ 09 июля 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 09 июля 2011

Поскольку @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];
}
...