我正在解析一个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);
结果是空的,虽然我知道变量存在。 我假设它与双引号有关,我没有正确地逃避它们。
任何人都可以提供帮助吗?
答案 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);
答案 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);