注意:此处使用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']";
或同等的。
答案 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'
的工作示例
如果你想从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);
请注意,我建议您使用文字插入字符串,而不是将一个占位符替换为另一个占位符。除了消除不必要的处理之外,它还意味着您可以检查结果字符串的内容,以确保它只包含数字和运算符(如果合适,还包含有限数量的函数)。