【问题标题】:Matching with preg_match_all与 preg_match_all 匹配
【发布时间】:2011-10-01 21:35:02
【问题描述】:

我得到了这个正则表达式:

$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)

【问题讨论】:

  • @Felix King:知道如何在 PHP 中获取捕获吗?有机会吗?
  • 呵呵,没想到这么简单的事情,PCRE 是不可能的。有什么解决办法吗?我基本上是在尝试匹配这个:字符串中的“(any_amount_of_numbers)”,只要它是字符串包含的唯一内容,根据需要多次。

标签: php regex preg-match pcre


【解决方案1】:

由于@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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2017-04-25
    • 2013-07-06
    • 2011-12-28
    • 2015-03-14
    相关资源
    最近更新 更多