gpt4 book ai didi

PHP preg_replace_callback() 和 create_function() 与 eval() 不起作用

转载 作者:行者123 更新时间:2023-12-02 11:59:51 26 4
gpt4 key购买 nike

我正在尝试在 Internet 上部署我的网站,以便在真实环境中对其进行测试。它是某种文本编辑器,用户可以在其中使用正则表达式和用户定义的回调函数。

我对 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()里面的$replacement是空的。但是当我在类之外使用相同的 create_function() 时 $replacement 不为空:

$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

最佳答案

您可以使用方法来代替 lambda 函数:

Class A
{
private $replacement;
public function check()
{
$string = 'series 3-4';
$pattern = 'series[ ]*(\d+)[ ]*-[ ]*(\d+)';
$this->replacement = '$match[2] == $match[1] + 1 ? "series $match[1] and $match[2]" : "series $match[1]-$match[2]"';
$modifiers = 'um';
$newString = preg_replace_callback(
'#' . $pattern . '#' . $modifiers,
array($this, 'replacementCallback'),
$string);
echo $newString;
}

private function replacementCallback($match)
{
return eval('return ' . $this->replacement . ';');
}
}

$a = new A;
$a->check();

关于PHP preg_replace_callback() 和 create_function() 与 eval() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com