PHP正则表达式,捕获重复匹配

时间:2015-10-15 13:27:23

标签: php regex

这是一个非常人为的例子,但我已经搜索了类似"正则表达式捕获重复匹配的内容"等等没有运气。

How to get all captures of subgroup matches with preg_match_all()?是我得到的最近的。

而不是一个例子,这是我的问题(

我的表格中有一个标签:

 name>>thing1(d1),thing2(d2),thing3(d3)::otherName

我想提取namething s及其数据(最多一个参数)和最后一位,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 - 我提出这个问题,因为性能在我的脑海里,我的规则已经看到了信息,我只需抓住它。所以我不会说这是一个不成熟的优化。

2 个答案:

答案 0 :(得分:1)

正如评论中所述(并阻止人们发布与文本匹配的规则(严重,请阅读Q)),我将在此处发布“解决方案”。

我使用这条规则:

^([a-z]+)>>(.*)::([a-z]+)$

(或者那种效果)

然后我可以在中间捕获上使用preg_match_all并以这种方式提取数据。令人讨厌的是,这并没有检查逗号。但我可以废除这一要求。

类似于:

 preg_match_all("([a-z]+)\(([a-z]+)\)",...

就是这样。

答案 1 :(得分:0)

也许我错过了一些东西......你不能用这样的东西:

/(?:(.*)>>)|(?:(thing.*?\)),?)|(?:::(.*))/g