繁体   English   中英

preg_match_all带引号的正则表达式

[英]preg_match_all regex with quotes

我正在解析一个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);

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

有人可以帮忙吗?

当一个合适的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

问题更可能与用户输入的特殊字符有关,这些字符在正则表达式中有一些含义(在你的情况下主要是美元,但也可能是其他字符)。 因此你需要转义它们(使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM