2012-08-25 156 views
2

我试图在互联网上部署我的网站,以便在真实环境中进行测试。它是某种文本编辑器,用户可以使用正则表达式和用户定义的回调函数。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 

回答

1

这工作,插入$replacement字符串值格式正确PHP源入函数的源代码:

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', ' 
          return eval("return " . '.var_export($replacement,true).' . ";"); 
         '), 
         $string); 
    echo $newString; 
} 
check(); // prints "series 3 and 4" 
?> 

但是为什么还要在代码将和荷兰国际集团eval它,当你可以只要把它直接作用来源:

<? 
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', ' 
          return '.$replacement.'; 
         '), 
         $string); 
    echo $newString; 
} 
check(); // prints "series 3 and 4" 
?> 
+0

是的,真的。现在我发现我根本不需要使用eval()。谢谢! – Placido

5

您可以代替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(); 
+0

IIRC的回调应该是'public' – zerkms

+0

我发布之前执行的代码。 PHP 5.3.13。编辑:刚刚检查5.2.17。也适用。 – Bugs

+0

非常感谢! – Placido