匹配初始化的整数值

时间:2012-06-25 10:35:35

标签: php regex perl

让我们说一个实例我有这个字符串:

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'

3 个答案:

答案 0 :(得分:2)

该功能正在使用“贪婪”匹配。你不希望这样。在PHP中,您可以使用?跟随通配符来指定非贪婪匹配,如:

$pattern = '/var (.*?=\d)/';

或使用U标记as documented here,如:

$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
)

注意:这会过滤 out 将RHS括在单引号中的条目。如果您不想这样,请告诉我们。


编辑#2 :我对你问题的回答超出了评论框的大小,所以我编辑了我的答案。

[a-zA-z]表达式仅匹配任一个案例的字母字符。请注意,更新的代码也删除了“ungreedy”修饰符,因此我们实际上希望它现在变得贪婪。而且由于我们希望它变得贪婪,.会“吃掉”太多。继续,使用代码,看看当你将其更改为.*时会发生什么,这是一个更熟悉正则表达式的好机会。

由于.“吃得太多”,我们需要限制它匹配所有字符以匹配我们想要的字符。我们可以使用像

这样的东西
$pattern = '/([^\s,]*=\d+)/';

其中[^\s,]*将匹配任意数量的非空格,非逗号字符。这也适用于您的测试用例。

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

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

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

试试这个正则表达式

$pattern = '/([a-zA-Z]+=\d+)/';