[英]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.