preg_match_all带引号的正则表达式

时间:2014-01-09 00:30:09

标签: php regex preg-match-all

我正在解析一个php文件,我希望从中获取一个特定的变量值。

说$ str ='$ title =“Hello world”; $ author =“极客蝙蝠侠”';

我想得到“极客蝙蝠侠”给予变量说,$ author。但我想动态地这样做。

让我们从html表单输入值说 所以

$myDynamicVar = $_POST['var']; //coming from form in the HTML
//$myDynamicVar = '$title = '; (the user will provide the dollar sign and the equal sign)

$pattern = '/\'. $myDynamicVar . '"(.*?)"/s';
$result = preg_match_all($pattern, $str, $output, PREG_SET_ORDER);

结果是空的,虽然我知道变量存在。 我假设它与双引号有关,我没有正确地逃避它们。

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:2)

proper tokenizer可用时,用正则表达式解析php代码有点疯狂:

$str = '$title = "Hello world" ; $author="Geek Batman"';

$tokens = token_get_all('<?php ' . $str);

$state = 0;
$result = null;

foreach ($tokens as $token) {
    switch ($state) {
        case 0:
            if ($token[0] == T_VARIABLE && $token[1] == '$author') {
                $state = 1;
            }
            break;

        case 1:
            if ($token[0] == T_CONSTANT_ENCAPSED_STRING) {
                $result = $token[1];
                break 2;
            }
            break;
    }
}

var_dump($result);

演示:http://ideone.com/bcV9ol

答案 1 :(得分:1)

问题更可能与用户输入的特殊字符有关,这些字符在正则表达式中有一些含义(在你的情况下主要是美元,但也可能是其他字符)。所以你需要转义它们(使用preg_quote),因此正则表达式与$匹配,而不是将其解释为end of line

(你用来逃避美元的方式不起作用,它正在逃避报价以关闭字符串,而不是在变量内容中逃避美元)

尝试以下方法:

$myDynamicVar = $_POST['var']; //coming from form in the HTML
//$myDynamicVar = '$title = '; (the user will provide the dollar sign and the equal sign)

$pattern = '/'. preg_quote($myDynamicVar) . '"(.*?)"/s';
$result = preg_match_all($pattern, $str, $output, PREG_SET_ORDER);