【发布时间】:2015-10-15 13:27:22
【问题描述】:
这是一个非常人为的例子,但我搜索了诸如“正则表达式捕获重复匹配”之类的东西,但没有运气。
How to get all captures of subgroup matches with preg_match_all()? 是我得到的最近的。
这里(有点)是我的问题,而不是一个例子。
我在表单中有一个标签:
name>>thing1(d1),thing2(d2),thing3(d3)::otherName
我想提取name,things 及其数据(最多一个参数)和最后的位,otherName
执行此操作的规则可能类似于:
^([a-z]+)>>(([a-z]+\([a-z]+\)(,[a-z]+\([a-z]+\))*)?::([a-zA-Z]]+)$
(此规则实际上不起作用,我缺少数字,但您应该对表格有所了解)
正如你所看到的,我实际上在这里匹配了我的模式,我想用*提取与重复匹配的块
以防自编辑后不清楚
我在匹配我的标签时没有遇到问题。我想一步提取标签的所有部分。所以我想要一个像这样的数组:
Array(`name`,Array(`thing1`,`d1`),Array(Array(`thing2`,`d2`),
Array(`thing3`,`d3`)),`otherName`)
我确实有一个后备
我想在一个表达式中做到这一点,因为我认为没有技术原因不能做到这一点。但是,作为“B 计划”,我可以只提取>> 和:: 之间的块并使用preg_match_all - 我提出这个问题是因为性能在我的脑海中,而我的规则已经查看了信息,我只需要抓住它。所以我不会说这是一个过早的优化。
【问题讨论】:
-
想想如果你在重复中有重复,知道结果数组中的什么来自哪里需要更多信息。不过我还是想知道有没有办法
-
重复捕获组只会捕获最后一次迭代。您需要在重复组周围放置一个捕获组以捕获所有迭代。
-
@WashingtonGuedes 如果我将示例更改为
(([a-z])+),那么我将得到bc作为匹配项和c。不是b和c的数组,这是我的目标。正如我提到的,我的后备方案是捕获很多,然后preg_match_all它。 -
为什么不
preg_match_all? -
@iismathwizard 看到上面的评论,我应该把它添加到问题中吗?现在更有意义了吗?