2017-06-17 232 views
0

我正在使用wordpress插件Ultimate Membership Pro。我的代码中有一个小警告。我无法弄清楚问题是什么。警告:preg_replace_callback():需要参数2,才能成为有效的回调

我试着检查PHP手册,也做这个主题的研究,但无法解决它。任何人有一个想法如何解决它?只需要一个提示。

PHP代码:

原始代码:

if (!empty($data->history)){ 
     //print the history 
     $dat = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $data->history); 
     $dat = unserialize($dat);  
     if (isset($dat) && is_array($dat)){ 
      foreach ($dat as $k=>$transaction_history_arr){ 
       if (is_string($transaction_history_arr)){ 
        //is json 
        $json = stripslashes($transaction_history_arr); 
        if ($k){ 
         echo '<h4>' . date('Y-m-d H:i:s', $k) .'</h4>'; 
        } 
        $arr = (array)json_decode($json, true); 
        foreach ($arr as $key=>$value){ 
         echo $key.': '.$value.'<br/>'; 
        } 
       } else {  
        //is an array 
        if ($k>0){ 
         echo '<h4>' . date('Y-m-d H:i:s', $k) .'</h4>'; 
        } 
        foreach ($transaction_history_arr as $key=>$value){ 
         echo $key.' : '.$value.'<br/>'; 
        } 
       } 
      } 
     } 
    } 

错误:

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /var/www/html/stock-market/wp-content/plugins/indeed-membership-pro/admin/includes/tabs/list_payments.php on line 44

更新与preg_replace_callback:

if (!empty($data->history)){ 
     //print the history 
     print_r($data->history); 
     $dat = preg_replace_callback('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $data->history); 
     $dat = unserialize($dat); 

对于更新的输出是这样的:

Warning: preg_replace_callback(): Requires argument 2, ''s:'.strlen('$2').':"$2";'', to be a valid callback in /var/www/html/stock-market/wp-content/plugins/indeed-membership-pro/admin/includes/tabs/list_payments.php on line 44 2017-06-17 08:44:49

ihc_payment_type : paypal 
    details : ss 
    uid : 1 
    level : 2 
    order_id : 21 
    amount : 100.00 
    currency : USD 
    txn_id : 1_21_1497689089 
    message : success 

我的数组是$数据 - >历史

a:1:{i:1497689089;a:9:{s:16:"ihc_payment_type";s:6:"paypal";s:7:"details";s:2:"ss";s:3:"uid";s:1:"1";s:5:"level";s:1:"2";s:8:"order_id";s:2:"21";s:6:"amount";s:6:"100.00";s:8:"currency";s:3:"USD";s:6:"txn_id";s:15:"1_21_1497689089";s:7:"message";s:7:"success";}}

警告:

Warning: preg_replace_callback(): Requires argument 2, ''s:'.strlen('$2').':"$2";'', to be a valid callback in /var/www/html/stock-market/wp-content/plugins/indeed-membership-pro/admin/includes/tabs/list_payments.php on line 47 
+0

错误消息非常简单。我想你只需要'preg_replace'。 – smarx

+0

@smarx我把它'preg_replace'改为'preg_replace_callback',并给我警告我的PHP不支持'preg_replace' php 7.x –

+0

根据http://php.net/manual/en/function.preg-replace .php,应该在PHP 7中支持'preg_replace'。什么是确切的错误信息? – smarx

回答

1

如果我说得对,你想要做什么,这可能是你在找什么:

$text = 'a:1:{i:1497689089;a:9:{s:16:"ihc_payment_type";s:6:"paypal";s:7:"details";s:2:"ss";s:3:"uid";s:1:"1";s:5:"level";s:1:"2";s:8:"order_id";s:2:"21";s:6:"amount";s:6:"100.00";s:8:"currency";s:3:"USD";s:6:"txn_id";s:15:"1_21_1497689089";s:7:"message";s:7:"success";}}'; 

$dat = preg_replace_callback('!s:(\d+):"(.*?)";!', 
    function ($match) { 
     return 's:'.strlen($match[2]).':"'.$match[2].'";'; 
    }, 
    $text); 

请注意,我已经从搜索模式扔下e修改,然后通过在作为第二参数的函数中。此功能会进行匹配并返回您想要的替换。

(另请注意,对于给定的输入,此替换不会改变任何内容。)

+0

谢谢!工作就像魅力:) –

相关问题