如何使用preg_match
找到所有PHP变量。我做了以下正则表达式:
$string = 'Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable';
$instring = array();
preg_match_all('/'$(.*?)/', $string, $instring);
print_r($instring);
我只是不明白正则表达式是如何工作的。
'$(.*?)
不是匹配 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)。还有一本好书叫《掌握正则表达式》,我可以推荐阅读。
另请参阅:
- PHP 语法正则表达 (2010 年 11 月;作者:hakre)
- 菲律宾比索
- PCRE - Perl 兼容正则表达式
非常感谢您的回答,这对我帮助很大。
这是正则表达式的详细版本,将查找扩展为至少具有数字索引的数组变量和前面的逻辑否定:
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]
感谢哈克雷的回答。我将它与更多内容结合起来,以匹配PHP数组变量和面向对象的变量:
'$(([a-zA-Z_'x7f-'xff][a-zA-Z0-9_'x7f-'xff]*(->)*)*('[[^']]*'])*)
这应该与以下变量匹配:
$this->that
$this["sure"]["thing"][0]
$var
$_GET["id"]
要查找所有变量(包括数组变量),您可以使用正则表达式 (perl):
'$([a-zA-Z_'x7f-'xff]*)'[([a-zA-Z]{1}[a-zA-Z0-9_]{1,32})']
然后,如果要替换它们(包括单引号),请将其替换为:
'$$1['$2']