【问题标题】:Warning: preg_replace_callback(): Requires argument 2, to be a valid callback警告:preg_replace_callback():需要参数 2,才能成为有效的回调
【发布时间】:2017-06-17 09:23:02
【问题描述】:

我正在使用 wordpress 插件 Ultimate Membership Pro。我的代码中有一个小警告。我不知道是什么问题。

我尝试查看 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/>';
                    }
                }
            }
        }
    }

错误:

警告:preg_replace():不再支持 /e 修饰符,请使用 preg_replace_callback 而不是在 /var/www/html/stock-market/wp-content/plugins/indeed-membership-pro/admin/includes/tabs/list_payments.php 第 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);

对于更新的输出,如下所示:

警告:preg_replace_callback():需要参数 2, ''s:'.strlen('$2').':"$2";'', 是一个有效的回调 /var/www/html/stock-market/wp-content/plugins/indeed-membership-pro/admin/includes/tabs/list_payments.php 在线 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

我的数组是 $data->history :

a:1:{i:1497689089;a:9:{s:16:"ihc_payment_type";s:6:"paypal";s:7:"详细信息";s:2:"ss";s :3:"uid";s:1:"1";s:5:"级别";s:1:"2";s:8:"order_id";s:2:"21";s:6 :"金额";s:6:"100.00";s:8:"货币";s:3:"USD";s:6:"txn_id";s:15:"1_21_1497689089";s:7:"消息";s:7:"成功";}}

警告:

 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

【问题讨论】:

  • 错误信息非常简单。我想你只需要preg_replace
  • @smarx 我将它 preg_replace 更改为 preg_replace_callback 并警告我的 php 不支持 preg_replace php 7.x
  • 根据php.net/manual/en/function.preg-replace.php,PHP 7 应该支持preg_replace。具体的错误信息是什么?
  • @smarx 警告:preg_replace():/e 修饰符不再受支持,请在 /var/www/html/stock-market/wp-content/plugins/indeed-membership- 中改用 preg_replace_callback pro/admin/includes/tabs/list_payments.php 第 44 行
  • 您不能使用带有变量的纯文本字符串,它必须是可调用的(函数),请查看documentation了解更多信息。

标签: php wordpress preg-replace preg-replace-callback


【解决方案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 修饰符,然后将函数作为第二个参数传入。这个函数接受一个匹配并返回你想要的替换。

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

【讨论】:

  • 谢谢!像魅力一样工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多