在PHP字符串中解析变量

时间:2016-05-31 08:06:49

标签: php parsing eval

注意:此处使用Eval完全了解,解析后的字符串仅由管理员输入,目的是将指令存储在数据库中,不受指令限制。 如果你有一个很好的选择,我们总是很感激,但不要只说“eval很糟糕”。

我在PHP中有一个String,例如

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

我想eval()这个字符串,但之前,我想修改字符串中的所有变量,如下所示:

$var2 -> $_POST['var2']

$myString中的变量之后可能有空格或可能没有空格。

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

输出应为:

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

或同等的。

3 个答案:

答案 0 :(得分:1)

不是最好的解决方案,但你可以预处理$ _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

答案 1 :(得分:0)

您使用错误的字符串括号引号。使用 <div class=" form-group has-feedback{{ $errors->has('name') ? ' has-error' : '' }}"> <input type="text" class="form-control" name="name" value="{{ old('name') }}" placeholder="Full Name"> @if ($errors->has('name')) <span class="help-block"> <strong>{{ $errors->first('name') }}</strong> </span> @endif </div>`<div class="form-group has-feedback{{ $errors->has('email') ? ' has-error' : '' }}"> <input type="email" class="form-control" name="email" value="{{ old('email') }}" placeholder="Email"> @if ($errors->has('email')) <span class="help-block"> <strong>{{ $errors->first('email') }}</strong> </span> @endif </div>`<div class="col-md-6"> <div class="form-group has-feedback{{ $errors->has('password') ? ' has-error' : '' }}"> <input type="password" class="form-control" name="password" placeholder="Password"> @if ($errors->has('password')) <span class="help-block"> <strong>{{ $errors->first('password') }}</strong> </span> @endif </div> </div>

'(35*$var1*64)/$var2'

eval

的工作示例

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

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

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

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

echo eval($myString);
//1120

答案 2 :(得分:0)

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

$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);

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