正则表达式整个字符串不匹配组件

时间:2015-02-24 01:03:26

标签: php regex string

我正在尝试扫描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

这有什么解决方法吗?我需要它一旦遇到"就会立即强制新的比赛。不仅仅是在最后。

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)

使用.*?(懒惰量词)而不是.*(贪婪量词)进行匹配,以便尽快匹配。

来源:http://www.regular-expressions.info/repeat.html