如何使用preg_match_all()获取子组匹配的所有捕获?

hak*_*kre 19 php regex grammar preg-match-all

更新/注意事项:

我认为我可能正在寻找的是用PHP 获取组捕获.

引用:使用命名模式子例程的PCRE正则表达式.

(仔细读:)


我有一个包含可变数量的段(简化)的字符串:

$subject = 'AA BB DD '; // could be 'AA BB DD CC EE ' as well
Run Code Online (Sandbox Code Playgroud)

我想现在匹配段并通过匹配数组返回它们:

$pattern = '/^(([a-z]+) )+$/i';
$result = preg_match_all($pattern, $subject, $matches);
Run Code Online (Sandbox Code Playgroud)

这只会返回捕获组2 的最后一个匹配:DD.

有没有办法,我可以检索所有的子模式捕获(的方式AA,BB,DD)与一个正则表达式执行?不preg_match_all适合这个吗?

这个问题是一个概括.

无论是$subject$pattern简化.自然地与这样的通用列表AA,BB..是更容易与其它功能(例如,以提取explode),或与的的变化$pattern.

但我特别询问如何使用preg_...-family函数返回所有子组匹配.

对于现实生活中的情况,假设您有多个(嵌套)级别的子模式匹配变量.

这是用于描述一些背景的伪代码的示例.想象一下:

令牌的常规定义:

   CHARS := [a-z]+
   PUNCT := [.,!?]
   WS := [ ]
Run Code Online (Sandbox Code Playgroud)

$subject得到基于这些的标记化.标记化存储在标记数组(type,offset,...)中.

然后将该数组转换为字符串,每个标记包含一个字符:

   CHARS -> "c"
   PUNCT -> "p"
   WS -> "s"
Run Code Online (Sandbox Code Playgroud)

因此,现在可以在令牌流字符串索引上运行基于令牌(而不是字符类等)的正则表达式.例如

   regex: (cs)?cp
Run Code Online (Sandbox Code Playgroud)

表达一组或多组字符,后跟标点符号.

我现在可以将自定义标记表达为正则表达式,下一步是构建语法.这只是一个例子,这是一种ABNF风格:

   words = word | (word space)+ word
   word = CHARS+
   space = WS
   punctuation = PUNCT
Run Code Online (Sandbox Code Playgroud)

如果我现在将单词的语法编译成(标记)正则表达式,我希望自然地拥有每个单词的所有子组匹配.

  words = (CHARS+) | ( (CHARS+) WS )+ (CHARS+)    # words resolved to tokens
  words = (c+)|((c+)s)+c+                         # words resolved to regex
Run Code Online (Sandbox Code Playgroud)

我可以编码直到这一点.然后我遇到了子组匹配的问题只包含他们的最后一场比赛.

所以我可以选择自己创建一个语法自动机(我想阻止语法表达式保持通用)或者某种程度上让preg_match为我工作,所以我可以省去它.

这基本上都是.可能现在可以理解为什么我简化了这个问题.


有关:

mot*_*sch 0

编辑

我不知道你最初要求什么。这是新的解决方案:

$result = preg_match_all('/[a-z]+/i', $subject, $matches);
$resultArr = ($result) ? $matches[0] : array();
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

11743 次

最近记录:

7 年,5 月 前