preg_match_all - 如何捕获所有子模式

时间:2015-12-31 11:37:40

标签: php regex regular-language

A有这个:

$pattern = "/\b(?:(one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)*){4,8}/ix";
$subject = "one  four-six  nine  twelve
zero eight nine  nine seven three six six";
$matches = [];

preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER);

我想看到的是$matches中所有分开的单词,但我首先只有9个,第二个则是6个 - 最后一个大模式的单词。我知道我可以将所有单个单词放在括号中,但是还有更好的方法+我会以这种方式获得空字符串

输出如:

array (size=2)
  0 => 
    array (size=2)
      0 => string 'one  four-six  nine  twelve
zero eight nine  ' (length=46)
      1 => string 'one'
      2 => string 'four' 
      3 => string 'six' 
      4 => string 'nine' 
      5 => string 'twelve' 
      6 => string 'zero' 
      7 => string 'eight' 
      8 => string 'nine' 
  1 => 
    array (size=2)
      0 => string 'nine seven three six six' (length=24)
      ...

2 个答案:

答案 0 :(得分:0)

更改了代码以匹配您的所有数字,并添加了一个名为数字的命名组:

<?php
$pattern = '/\b(?<number>one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)/';
$subject = "one  four-six  nine  twelve
zero eight nine  nine seven three six six";
$matches = [];

preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER);
print_r($matches);
?>

这有十二(全部)结果。请参阅regex101.com here上的演示。

答案 1 :(得分:0)

  

我想看到的是$matches中所有分开的单词,但我得到了   第一个只有九个,第二个只有六个 - 大模式的最后一个词。

不幸的是,就像Repetition所说的那样:

  

当重复捕获子模式时,捕获的值是   与最终迭代匹配的子字符串。

  

我知道我可以将所有单个单词放在括号中,但是还有更多   好方法......

一种方法是在之后拆分找到的匹配项:

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);
foreach ($matches as &$m)
    // replace $m[1] with the split match
    array_splice($m, 1, 1, preg_split('/\s|-/', $m[0], 0, PREG_SPLIT_NO_EMPTY));
unset($m);  // remove the reference to the last element

这将在$matches中产生所需的结果。