假设我有一个字符串:
12345678
我也有以下模式:
/^.*$/
/^[0-9]+$/
这两种模式都匹配字符串。我想知道两种模式都匹配字符串。我可以循环遍历每个模式并投入preg_match
,但这太慢了。
我希望能够做到这样的事情:
preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches);
然而,这会给我一些类似的东西:
[
'pattern1' => '12345678',
'pattern2' => ''
]
如您所见,pattern2显示为空,因为模式1已经捕获了字符串。
我如何编写preg_match_all
正则表达式,以便pattern1和pattern2(以及任何其他模式)都有机会匹配相同的字符串?但是,如果只有所有模式匹配,我不会遵循正则规则返回所有模式。我希望它返回所有匹配的模式和所有不匹配的模式。
修改
进一步澄清,
我作为例子给出的模式只是例子。
在我的实际场景中,将会有未知数量的模式匹配未知字符串。
循环使用foreach的原因太慢了因为我将使用数千个字符串循环遍历数十个模式。如果可以将每个字符串有效地组合成一个规则,我可以通过有多少模式来加速这部分代码。
答案 0 :(得分:1)
您可以使用以下技巧:
^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$
因为pattern2在pattern1内部并且由|
分隔..每个字符都会检查两个匹配项。
请参阅DEMO