7

如何使用preg_match. 我做了以下正则表达式:

$string = 'Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable';
$instring = array();
preg_match_all('/\$(.*?)/', $string, $instring);
print_r($instring);

我只是不明白正则表达式是如何工作的。

4

4 回答 4

22
\$(.*?)

不是匹配 PHP 变量名的正确正则表达式。变量名称的这种正则表达式实际上是 PHP 手册的一部分,并给出为(不带前导美元符号):

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

所以在你的情况下,我会尝试:

\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)

取而代之的是。请参阅以下示例

<?php
/**
 * Find all PHP Variables with preg_match
 *
 * @link http://stackoverflow.com/a/19563063/367456
 */

$pattern = '/\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)/';

$subject = <<<'BUFFER'
Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable
BUFFER;

$result = preg_match_all($pattern, $subject, $matches);

var_dump($result);
print_r($matches);

输出:

int(5)
Array
(
    [0] => Array
        (
            [0] => $var
            [1] => $var
            [2] => $iam
            [3] => $varvarvar
            [4] => $variable
        )

    [1] => Array
        (
            [0] => var
            [1] => var
            [2] => iam
            [3] => varvarvar
            [4] => variable
        )

)

如果您想了解 PHP 中的正则表达式是如何工作的,您需要阅读 PHP 手册以及使用的正则表达式方言 (PCRE) 手册。还有一本好书叫做“掌握正则表达式”,我可以建议阅读。

另见:

于 2013-10-24T10:12:47.853 回答
1

感谢hakre的回答。我将它与更多内容结合起来以匹配 PHP 数组变量和面向对象的变量:

\$(([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(->)*)*(\[[^\]]*\])*)

这应该匹配以下变量:

$this->that
$this["sure"]["thing"][0]
$var
$_GET["id"]
于 2019-05-29T01:24:49.717 回答
1

非常感谢各位的回答,对我帮助很大。

这是正则表达式的详细版本,将查找结果扩展为数组变量,其中至少具有数字索引和前面的逻辑否定:

function get_variables_from_expression($exp){
    $pattern = '/((!\$|\$)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*[0-9\[\]]*)/';
    $result = preg_match_all($pattern,$exp,$matches);
    return($matches[0]);
}

$example = '(($aC[5][7][1]xor((((!$a[5]&&!$a[4])&&!$a[3])&&!$a[2])&&$aC[6][6][0]))xor$aC[6][6][2])';
$list = get_variables_from_expression($example);

foreach($list as $var){
    echo "$var<br>";
}

结果是:

$aC[5][7][1]
!$a[5]
!$a[4]
!$a[3]
!$a[2]
$aC[6][6][0]
$aC[6][6][2]
于 2017-11-11T06:54:09.873 回答
0

要查找所有变量(包括数组变量),您可以使用正则表达式(perl):

\$([a-zA-Z_\x7f-\xff]*)\[([a-zA-Z]{1}[a-zA-Z0-9_]{1,32})\]

然后,如果您想替换它们,包括单引号,则将它们替换为:

\$$1['$2']

于 2018-09-07T12:14:07.963 回答