我有一个这样的字符串:
$str ="
- group1
- group2
- group3
";
我也有这个正则表达式:
/('-'s'w+)'n('-'s'w+)'n('-'s'w+)/
如您所知,有三个捕获组:$1
,$2
和$3
。我手动制作了这些组。我的意思是如果我将其附加到上面的字符串中:
- group4
- group5
然后该正则表达式与它们不匹配。
好吧,我有一个恒定的模式:('-'s'w+)
,并且我想在字符串中的匹配项数量上创建一个单独的捕获组。Hare是几个例子:
示例 1:
$str="
- group 1
";
我需要一个正则表达式来通过$1
给我所有的字符串。
示例 2:
$str="
- group 1
- group 2
";
我需要一个正则表达式来给我第一行字符串 ( - group 1
) 按$1
和第二行 ( - group 2
) 按$2
好吧,正如您在上面的例子中看到的,字符串是动态的,但它是根据恒定模式...现在我想知道如何根据字符串创建动态捕获组?
无法捕获重复组是一个众所周知的限制。
如果您知道最大重复模式,则可以将正则表达式设置为 (即.max=5):
/('-'s'w+)'n('-'s'w+)?'n?('-'s'w+)?'n?('-'s'w+)?'n?('-'s'w+)?'n?/
您将在 1 到 5 的小组中找到一到五场比赛。
实质上,您必须重复('-'s'w+)?'n?
才能获得最大可能的重复模式数。
否则,如果您的最大可能数量未定义,我不知道除了构建动态模式之外的其他方法,例如:
$regex = '('-'s'w+)'n';
$regex = '/'.( str_repeat( $regex, preg_match_all( "/$regex/", $str, $matches ) ) ).'/';
上面的模式会起作用,但我不知道您的确切替换条件,因此它可能无法用于您的目的。
使用 m 修饰符(多行):这将让每行匹配。
尝试使用以下正则表达式:
preg_match_all('/('-'s'w+)/m', $str, $matches);
print_r($matches);