Php Regex在同一模式上有多个捕获组

Php Regex在同一模式上有多个捕获组,php,regex,preg-match-all,capture,regex-group,Php,Regex,Preg Match All,Capture,Regex Group,假设我有一个字符串: 12345678 我还有以下几种模式: /^.*$/ /^[0-9]+$/ 这两种模式都与字符串匹配。我想找出两种模式都匹配字符串。我可以在每个模式中循环并抛出一个preg\u匹配,但这太慢了 我希望能够做到以下几点: preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches); 正如您所看到的,pattern2是空的,因为Pattern1已经捕获

假设我有一个字符串:

12345678
我还有以下几种模式:

/^.*$/
/^[0-9]+$/
这两种模式都与字符串匹配。我想找出两种模式都匹配字符串。我可以在每个模式中循环并抛出一个
preg\u匹配
,但这太慢了

我希望能够做到以下几点:

preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches);
正如您所看到的,pattern2是空的,因为Pattern1已经捕获了字符串

如何编写我的
preg\u match\u all
regex,以便pattern1和pattern2(以及任何其他模式)都有机会匹配相同的字符串?然而,我并不想要一个正则表达式规则,如果所有模式都匹配,它将返回所有模式。我希望它返回所有匹配的模式和所有不匹配的模式

编辑

只是为了进一步澄清,

我作为例子给出的模式只是例子

在我的实际场景中,将有未知数量的模式匹配未知字符串


在foreach中循环太慢的原因是,我将使用数千个字符串在几十个模式中循环。如果每个字符串可以有效地组合成一个规则,我可以通过有多少个模式来加速这部分代码。

您可以使用以下技巧:

^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$
^(?P(?P^[0-9]+$)|*)$
因为pattern2位于pattern1内部,由
|
分隔。。将检查两个匹配项的每个字符


请参见“太慢”是什么意思?你用这个做什么?这些是你正在检查的模式,还是仅仅是这个问题的一个简单例子?如果这些是实际的模式,那么只需检查strlen()和is͢int()的值,而不是使用正则表达式,性能就会更好。@Ja͢ck我将其用作高性能url路由器的一部分。我知道FastRoute存在,但即使缓存FastRoute,我的解决方案的平均速度也已经提高了1.5倍。我需要这些模式的部分是唯一的瓶颈,因为foreach在这些模式上的循环花费了太多的时间。@CJWurtz这些模式只是简单的例子。实际上,模式将由库的用户定义,并且对它们可以匹配的内容没有限制;这不是正则表达式匹配的目的,问题是顺序很重要;如果您切换这两个模式并创建一个字符串,如
“a12345678”
,您将获得错误的匹配项。如果
“a12345678”
匹配项应该是什么?无论您以何种顺序提供模式,一个匹配项都应为空。如果您交换模式,则该匹配项不为空,即,
^.*$
作为内部模式,
\d+
作为替代模式。是。。子集应位于内部块中。。这就是为什么我这样写正则表达式。。为什么要交换模式呢?具体问题有一定的解决办法。。更改同一问题的解决方案可能并不总是有效。。
^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$