Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 匹配初始化的整数值_Php_Regex_Perl - Fatal编程技术网

Php 匹配初始化的整数值

Php 匹配初始化的整数值,php,regex,perl,Php,Regex,Perl,假设有一个实例,我有以下字符串: var a=23434,bc=3434,erd=5656,ddfeto='dsf3df34dff3',eof='sdfwer34',wer=4554 如何匹配指定为整数的所有初始化?这是我目前的尝试,但我不明白为什么它与所有东西都匹配 $pattern = '/var (.*=\d)/'; preg_match_all($pattern,$page,$matches); 编辑:我正在尝试匹配每个初始化: 1 => a=23434 2 => bc=3

假设有一个实例,我有以下字符串:

var a=23434,bc=3434,erd=5656,ddfeto='dsf3df34dff3',eof='sdfwer34',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'
该函数正在使用“贪婪”匹配。你不会想要的。在PHP中,您可以在通配符后面加一个
来指定非贪婪匹配,如下所示:

$pattern = '/var (.*?=\d)/';
或者使用
U
标志,如:

这将使所有通配符使用非贪婪匹配

编辑:另外,由于您包含“var”,您可能需要将其更改为

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

匹配任意数量的
(.*=\d)
模式


编辑:每次讨论更新:

$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]);
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]);
产生

$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:我对你问题的回答超出了评论框的大小,因此我编辑了我的回答

$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]);
[a-zA-z]
表达式只匹配两种情况下的字母字符。请注意,更新后的代码还删除了“ungreedy”修饰符,因此我们实际上希望它现在是贪婪的。既然我们希望它贪婪,那么
就会“吃”太多。继续,玩转代码,看看当您将其更改为
*
时会发生什么。这是一个更好地熟悉regex的好机会

由于
“吃”太多,我们需要限制它从匹配所有字符到匹配我们想要的字符。我们可以用类似的东西

$pattern = '/([^\s,]*=\d+)/';
其中,[^\s,]*
将匹配任意数量的非空白、非逗号字符。这也适用于您的测试用例

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

就像很多事情一样,特别是在编程中,有很多方法可以剥猫皮。有许多替代的正则表达式模式也适用于您的测试用例。这取决于您了解每种方法的限制、它们在边缘情况下的性能以及它们的可维护性,并做出决定。

该函数使用“贪婪”匹配。你不会想要的。在PHP中,您可以在通配符后面加一个
来指定非贪婪匹配,如下所示:

$pattern = '/var (.*?=\d)/';
或者使用
U
标志,如:

这将使所有通配符使用非贪婪匹配

编辑:另外,由于您包含“var”,您可能需要将其更改为

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

匹配任意数量的
(.*=\d)
模式


编辑:每次讨论更新:

$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]);
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]);
产生

$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:我对你问题的回答超出了评论框的大小,因此我编辑了我的回答

$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]);
[a-zA-z]
表达式只匹配两种情况下的字母字符。请注意,更新后的代码还删除了“ungreedy”修饰符,因此我们实际上希望它现在是贪婪的。既然我们希望它贪婪,那么
就会“吃”太多。继续,玩转代码,看看当您将其更改为
*
时会发生什么。这是一个更好地熟悉regex的好机会

由于
“吃”太多,我们需要限制它从匹配所有字符到匹配我们想要的字符。我们可以用类似的东西

$pattern = '/([^\s,]*=\d+)/';
其中,[^\s,]*将匹配任意数量的非空白、非逗号字符。这也适用于您的测试用例

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


就像很多事情一样,特别是在编程中,有很多方法可以剥猫皮。有许多替代的正则表达式模式也适用于您的测试用例。您需要了解每种方法的限制、它们在边缘情况下的性能以及它们的可维护性,然后做出决定。

您不必使用正则表达式:

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

您不必使用正则表达式:

$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
    }
}
试试这个正则表达式

$pattern = '/([a-zA-Z]+=\d+)/';
试试这个正则表达式

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

它只匹配第一次初始化Hi,您能解释一下为什么使用
[a-zA-Z]
而不是
?谢谢。@Barsoom,因为我的答案太长了,所以我编辑了我的帖子作为回应——见编辑2。非常感谢@jedwards,我很感谢你的解释,这是一个了解东西如何工作的好方法。它只匹配了第一次初始化。嗨,你能解释一下为什么你使用
[a-zA-Z]
而不是
?谢谢。@Barsoom,因为我的回答太长了,所以我编辑了我的帖子作为回应——见编辑#2。非常感谢@jedwards,我很感谢你的解释,这是一个真正了解东西如何工作的好方法。那么,@Barsoom,这是你想要的吗?那么,@Barsoom,这是你想要的吗?