解析 PHP 字符串中的变量

Parse variables in PHP string

注意:这里用的eval是全知识,解析出来的字符串只有管理员输入,目的是存入数据库,对指令没有限制. 如果你有一个好的选择,总是很感激,但不要只说 "eval is bad".

我在 PHP 中有一个字符串,例如

$myString = "(35*$var1*64)/$var2";

我想eval()这个字符串,但是之前,我想像这样修改字符串中的所有变量:

$var2 -> $_POST['var2']

$myString 中的变量后可能有也可能没有空格 space。

当我评估 $myString 时,PHP 抛出错误 "Undefined variable $var1"。 PHP读取字符串并解析变量,所以我想应该有一种方法可以解析字符串中的所有变量。

输出应该是:

$myStringParsed = "(35*$_POST['var1']*64)/$_POST['var2']";

或同等学历。

这可能不是最好的解决方案,但您可以像这样预处理 $_POST 变量并生成 $variablesString:

$variablesString = '';
foreach($_POST as $key => $val) {
    $variablesString .= '$' . $key . ' = ' . $val . ';' . PHP_EOL;
}

eval($variablesString . PHP_EOL . $myString)

对于字符串支持,您可以检查 $val 是否为字符串,如果是 - 用引号将其括起来。

第二种方式

$myString = 'return (35 * $var1 * 64) / $var2;';
$re = "/\$(\w*)/im";

preg_match_all($re, $myString, $matches);

foreach($matches[1] as $match) {
    $search = '$' . $match;
    $replace = '$_POST[\'' . $match . '\']';
    $myString = str_replace($search, $replace, $myString);
}
echo eval($myString);

你可以看看here

您使用了错误的引号字符串。使用 '(35*$var1*64)/$var2':

//$var1 = $_POST['var1'];
//$var2 = $_POST['var2'];

$var1 = '10';
$var2 = '20';

$myString = 'return (35 * $var1 * 64) / $var2;';

echo eval($myString);
//1120

eval

的工作示例

如果您想从 POST 获取任何变量,那么您可以使用 extract() 将数组键作为具有关联值的变量获取:

<?php
// Change it to real $_POST
$POST = [
    'var1' => '10',
    'var2' => '20',
];

extract($POST, EXTR_SKIP);

$myString = 'return (35 * $var1 * 64) / $var2;';

echo eval($myString);

假设你的意思是......

$myString = '(35*$var1*64)/$var2';

比 ASGM 建议的更可靠的解决方案(考虑 $myvar10)是:

$replace=array(
   '/\b$var1\b/'=>$_POST['var1'], 
   '/\b$var2\b/'=>$_POST['var2'],
   ...
);
$interpolated=preg_replace(array_keys($replace)
    , $replace, $myString);

请注意,我建议您用文字插入字符串,而不是用一个占位符替换另一个。除了消除不必要的处理之外,这还意味着您可以检查结果字符串的内容以确保它仅包含数字和运算符(以及适当数量的函数)。