我有一个这样的字符串:
$str ="
- group1
- group2
- group3
";
我也有regex:
/(\-\s\w+)\n(\-\s\w+)\n(\-\s\w+)/
如您所知,有三个捕获组:$1
,$2
和$3
。我手动制作了这些组。我的意思是如果我将它附加到上面的字符串:
- group4
- group5
然后那个正则表达式与它们不匹配。
好吧,我有一个恒定的模式:(\-\s\w+)
,我想在字符串中的匹配项数量上创建一个单独的捕获组。野兔就是一些例子:
例1:
$str="
- group 1
";
我需要一个正则表达式,通过$1
给我所有字符串。
例2:
$str="
- group 1
- group 2
";
我需要一个正则表达式给我- group 1
的第一行字符串($1
)和- group 2
的第二行($2
)
好吧,正如你在上面的例子中看到的那样,字符串是动态的,但是它是按照常量模式...现在我想知道如何根据字符串创建动态捕获组?
答案 0 :(得分:1)
使用m修饰符(多行):将在每一行上匹配。
尝试使用以下正则表达式:
preg_match_all('/(\-\s\w+)/m', $str, $matches);
print_r($matches);
答案 1 :(得分:1)
捕捉重复组的不可能性为well known limitation。
如果您知道最大重复模式,可以将正则表达式设置为(即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 ) ) ).'/';
上述模式可行,但我不知道您的确切替换条件,因此它可能无法用于您的目的。