Php 使用字符串作为要发送到eval()的表达式,并用可变值替换子字符串

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**

我需要一些关于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**               
               //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)){…}
Do
if(strlen($var)=1{…}/code>