该函数使用“贪婪”匹配。你不想要那个。在 PHP 中,您可以在通配符后面加上 a?
来指定非贪婪匹配,如下所示:
$pattern = '/var (.*?=\d)/';
或使用此处记录U
的标志,如:
$pattern = '/var (.*=\d)/U';
这将使所有通配符使用非贪婪匹配。
编辑:另外,由于您包含“var”,您可能需要将其更改为
$pattern = '/var (.*?=\d)*/';
或者
$pattern = '/var (.*=\d)*/U';
匹配任意数量的(.*=\d)
模式。
编辑:每次讨论更新:
PHP
$page = "var a=23434,bc=3434,erd=5656,ddfeto='dsf3df34dff3',eof='sdfwerwer34',wer=4554;";
$pattern = '/([a-zA-Z]+=\d+)/';
preg_match_all($pattern,$page,$matches);
print_r($matches[1]);
生产
Array
(
[0] => a=23434
[1] => bc=3434
[2] => erd=5656
[3] => wer=4554
)
注意:这会过滤掉RHS 用单引号括起来的条目。如果你不想这样,请告诉我们。
编辑#2:我对你问题的回答超出了评论框的大小,所以我编辑了我的答案。
该[a-zA-z]
表达式仅匹配任一大小写的字母字符。请注意,更新后的代码还删除了“不贪婪”修饰符,所以我们现在实际上希望它是贪婪的。而且由于我们希望它贪婪,所以它.
会“吃”得太多。来吧,玩弄代码,看看当你改变它时会发生什么,.*
这是一个更好地熟悉正则表达式的好机会。
由于.
“吃”太多,我们需要限制它匹配所有字符以匹配我们想要的字符。我们可以使用类似的东西
$pattern = '/([^\s,]*=\d+)/';
其中[^\s,]*
将匹配任意数量的非空白、非逗号字符。这也适用于您的测试用例。
但是在这种情况下,我们可以自信地说出我们想要包含的字符是什么,所以我们不会将字符“列入黑名单”,而是将它们“列入白名单”。在这种情况下,我们指定我们要匹配任何一种情况下的任何字母字符。
与许多事情一样,特别是在编程中,有很多方法可以给猫剥皮。有许多替代正则表达式模式也适用于您的测试用例。由您来了解每个限制,它们将如何在边缘情况下执行,以及它们的可维护性,并做出决定。