Php 使用字符串作为要发送到eval()的表达式,并用可变值替换子字符串
我需要一些关于PHP基本语法的帮助 我得到了以下字符串:Php 使用字符串作为要发送到eval()的表达式,并用可变值替换子字符串,php,expression,eval,quotes,str-replace,Php,Expression,Eval,Quotes,Str Replace,我需要一些关于PHP基本语法的帮助 我得到了以下字符串: $str=“return(strlen(replace)=1);” 我得到了一个变量:$var=“VariableValue” st_replace函数为:str_replace('replace',$var,$str) 我想做的是在一些事情中使用eval,比如: if(eval($str)){//This should now make the if condition **look like**
$str=“return(strlen(replace)=1);”代码>
我得到了一个变量:$var=“VariableValue”代码>
st_replace函数为:str_replace('replace',$var,$str)代码>
我想做的是在一些事情中使用eval,比如:
if(eval($str)){//This should now make the if condition **look like**
//if(strlen(*'VariableValue'*)...)
//
echo 'Success';
}else{
echo 'Ask the guys at StackOverFlow :),sure after searching for it';
}
如果你注意到什么是if(strlen('VariableValue')…)这就是我想要做的,在eval之后做最后一个if语句,包含带引号的vars值,这样strlen就可以实际处理它
我希望我在需要时说清楚:)
提前谢谢你,你不需要eval()(它有时被称为邪恶()是有原因的)
试试这样的条件:
if ( (strlen($var) <= 5) && (strlen($var) >= 1) )
if((strlen($var)=1))
像这样试试看
$str = "return (strlen(##replace##) <= 5 && strlen(##replace##) >= 1);";
$var = 'test';
// you have to assign the str_replace to $str again. And use " around the $var.
$str = str_replace('##replace##', '"' . addslashes($var) . '"', $str);
if (eval($str)) {
echo 'Success';
}
else {
echo 'Ask the guys at StackOverFlow :),sure after searching for it';
}
$str=“return(strlen(####replace##)=1);”;
$var='test';
//您必须再次将str_replace分配给$str。并使用“围绕$var”。
$str=str#u replace(‘#####’、‘’、‘’。addslashes($var)。‘’、$str);
如果(eval($str)){
呼应"成功",;
}
否则{
echo“询问StackOverFlow的员工:”,搜索后确定;
}
我在replace中添加了####around replace,因为总是有一个比较独特的字符串来替换是一个好主意……比如当您将求值代码扩展到包含str#u replace
时,该字符串也会被替换
编辑
根据@erburat的评论,用addslashes
跳过$var。没错,这对eval不是一个好的用途,但是如果eval是纯粹的邪恶,没有用例,它就不会存在了。或者至少在PHP 5中会被弃用。4@SJFrK当前位置我从未声称这是纯粹的邪恶。对不起,如果我听起来粗鲁,那不是我的本意。我只是不喜欢艾尔l那些关于评估善与恶、数据库表名复数或单数、在同一行或下一行打开大括号等的战争@SJFrK:我完全同意你的看法。我不想挑起战争或其他任何事情。我只想提到eval()可能是邪恶的,如果你真的必须使用它,三思而后行绝对是有意义的。在98%的情况下,有更简单更安全的解决方案。伙计们,如果我只使用eval,也就是说,我正在替换一个我只知道的常量字符串,那么它就足够安全了吗?如果变量字符串包含引号或其他控制字符,你应该对它进行转义Ers太棒了,非常感谢,你认为有没有其他方法可以不使用eval(但仅使用与@arkascha在另一个答案中所述相同的技术)来做我正在尝试做的事情:直接使用变量:所以不要使用if(eval($code)){…}
Doif(strlen($var)=1{…}/code>