我正在尝试扫描PHP文件以获取变量定义,例如$测试=" 1&#34 ;;并返回变量名和值,这是我到目前为止所尝试的:
preg_match_all('/\$(.*)="(.*)";/', $content, $out);
当我在不同的行上定义了很多变量时,这很好用,例如:
$test1="1";
$test2="2";
$test3="3";
但是当变量一个接一个地定义时,我的匹配只返回一个巨大的字符串,例如
$test1="1";$test2="2";$test3="3";
我认为这是因为它被解释为:
$test1="[content]";
Where [content] = 1";$test2="2";$test3="3
这有什么解决方法吗?我需要它一旦遇到"就会立即强制新的比赛。不仅仅是在最后。
答案 0 :(得分:2)
你需要让你的比赛非贪婪。您可以使用量词*?
代替*
来完成此操作。
$content = '$test1="1";$test2="2";$test3="3";';
$out = array();
preg_match_all('/\$(.*?)="(.*?)";/', $content, $out);
var_dump($out);
输出:
array(3) {
[0]=>
array(3) {
[0]=>
string(11) "$test1="1";"
[1]=>
string(11) "$test2="2";"
[2]=>
string(11) "$test3="3";"
}
[1]=>
array(3) {
[0]=>
string(5) "test1"
[1]=>
string(5) "test2"
[2]=>
string(5) "test3"
}
[2]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
}
答案 1 :(得分:1)
.*
之类的贪婪表达式会在满足剩余表达式的同时尝试尽可能多地匹配。如果每个分配都在一个单独的行上(并且没有/s
[dot-matches-all]修饰符),.*
会在第一个遇到的换行符时停止匹配;这就是为什么当分配各自都在他们自己的行上时它起作用。
可以修改第一个贪婪表达式以使用负字符集;第二个贪婪的表达式需要通过附加一个问号而变得非贪婪(因为双引号可能会被转义,否则你需要一个更复杂的模式来考虑它):
/\$([^=]*)="(.*?)";/
[^=]*
将匹配除等号以外的任何内容,而.*?
将尽快匹配,同时满足剩余的表达式。
答案 2 :(得分:0)
使用.*?
(懒惰量词)而不是.*
(贪婪量词)进行匹配,以便尽快匹配。