我试图在互联网上部署我的网站,以便在真实环境中进行测试。它是某种文本编辑器,用户可以使用正则表达式和用户定义的回调函数。PHP preg_replace_callback()和createvalue()与eval()不起作用
我有一些preg_replace_callback()函数的问题。我的托管有PHP版本比5.3更旧,我不能在我的代码中使用匿名函数(我在本地有PHP 5.4)。所以,我必须重写代码的这一部分(其在本地主机正常工作)
$newString = preg_replace_callback(
'#' . $this->pattern . '#' . $this->modifiers,
function($match)
{
return eval('return ' . $this->replacement . ';');
},
$string);
在这一点上,我不谈论使用eval()的危险性 - 这个问题将支付适当关注一点稍后(“禁止”的单词列表检查等)。问题是,我的尝试下面
$replacement = $this->replacement;
$newString = preg_replace_callback(
'#' . $this->pattern . '#' . $this->modifiers,
create_function('$match', '
global $replacement;
return eval(\'return \' . $replacement . \';\');
'),
$string);
不工作,没有错误发生。我的代码有什么问题?
任何帮助将不胜感激。
新信息。我已经试过这
Class A
{
public function check()
{
$string = 'series 3-4';
$pattern = 'series[ ]*(\d+)[ ]*-[ ]*(\d+)';
$modifiers = 'um';
$replacement = '$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"';
$newString = preg_replace_callback(
'#' . $pattern . '#' . $modifiers,
create_function('$match', '
global $replacement;
echo $replacement;
return eval(\'return \' . $replacement . \';\');
'),
$string);
echo $newString;
}
}
$a = new A;
$a->check();//get nothing
,并发现$更换内部create_function()是空的。但是,当我用同样的create_function()类$更换外不为空:
$string = 'series 3-4';
$pattern = 'series[ ]*(\d+)[ ]*-[ ]*(\d+)';
$modifiers = 'um';
$replacement = '$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"';
$newString = preg_replace_callback(
'#' . $pattern . '#' . $modifiers,
create_function('$match', '
global $replacement;
echo $replacement . "<br/>";
return eval(\'return \' . $replacement . \';\');
'),
$string);
echo $newString;
//$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"
//series 3 and 4
是的,真的。现在我发现我根本不需要使用eval()。谢谢! – Placido