2

假设我有这个字符串:

var a=23434,bc=3434,erd=5656,ddfeto='dsf3df34dff3',eof='sdfwerwer34',wer=4554;

我应该如何匹配分配为整数的所有初始化?这是我目前的尝试,但我不明白为什么它匹配所有内容。

$pattern = '/var (.*=\d)/';
preg_match_all($pattern,$page,$matches);

编辑:我正在尝试匹配每个初始化:

1 => a=23434
2 => bc=3434

等等...

编辑:这是我尝试的更新:

$pattern = '/[^v^a^r] (.*=\d+),/';
preg_match_all($pattern,$page,$matches);

0 => 'var a=23434,bc=3434,erd=5656,'
1 => 'a=23434,bc=3434,erd=5656'
4

3 回答 3

2

该函数使用“贪婪”匹配。你不想要那个。在 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,]*将匹配任意数量的非空白、非逗号字符。这也适用于您的测试用例。

但是在这种情况下,我们可以自信地说出我们想要包含的字符是什么,所以我们不会将字符“列入黑名单”,而是将它们“列入白名单”。在这种情况下,我们指定我们要匹配任何一种情况下的任何字母字符。

与许多事情一样,特别是在编程中,有很多方法可以给猫剥皮。有许多替代正则表达式模式也适用于您的测试用例。由您来了解每个限制,它们将如何在边缘情况下执行,以及它们的可维护性,并做出决定。

于 2012-06-25T10:40:00.680 回答
1

您不必使用正则表达式:

$string = substr($string, 4); // remove the first 4 characters, 'var '
$pairs = explode(',', $string); // split using the comma
foreach ($pairs as $pair) {
    list($key, $value) = explode('=', $pair);
    if (is_int($value)) {
        // this is an integer
    } else {
        // not an integer
    }
}
于 2012-06-25T10:41:22.030 回答
1

试试这个正则表达式

$pattern = '/([a-zA-Z]+=\d+)/';
于 2012-06-25T10:48:25.847 回答