PHP preg_replace:已弃用

时间:2014-03-22 10:33:12

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

将我的php切换到5.5.8后,我有这个不推荐的警告,

  

不推荐使用:preg_replace():不推荐使用/ e修饰符   preg_replace_callback改为 C:\ wamp \ www ... Curly.php on   第 28

这是我班Curly

中的功能
public function replace ($input, $options = array()) {

        return preg_replace("/\{{2}(([a-z\_]+\|.+)|([a-z\_]+))\}{2}/Ue",'$this->_replace("\\1",$options)',$input);
    }

所以,如果我改为使用preg_replace_callback

return preg_replace_callback("/\{{2}(([a-z\_]+\|.+)|([a-z\_]+))\}{2}/Ue",'$this->_replace("\\1",$options)',$input);

然后我收到此错误,

  

警告:preg_replace_callback():需要参数2,   ' $ this-> _replace(" \ 1",$ options)',成为有效的回调   在 C:\ wamp \ www ... Curly.php 28

任何想法我该如何解决这个问题?

修改

class Curly extends CoreModel
{
    // Set the property/ variable of this class
    public $constant = null;

    /**
     * Extend the parent class property.
     */ 
    public function __construct($connection){

       // Extend parent's.
       parent::__construct($connection);
       $this->constant = new Constant($connection);
    }

    /**
     * Replace the curly in an input string
     * @param string $input
     * @return string
     */
    public function replace ($input, $options = array()) {

        //return preg_replace("/\{{2}([a-z]+\|.+)\}{2}/Ue",'$this->_replace("\\1")',$input);
        //return preg_replace("/\{{2}(([a-z\_]+\|.+)|([a-z\_]+))\}{2}/Ue",'$this->_replace("\\1",$options)',$input);
        return preg_replace_callback(
            "/\{\{([a-z_]+(?:\|.+)?)\}\}/U",
            function($m) { return $this->_replace($m[1], $options); }, 
            $input
        );
    }

    /**
     * Run the replacement code on a given macro string
     * @param string $input
     * @return string
     */
    private function _replace ($input,$options) {

        // Set local vars.
        $defaults = array();

        // Call internal method to process the array.
        $array = parent::arrayMergeValues($defaults,$options);
        //print_r($array);

        // Convert array to object.
        $property = parent::arrayToObject($array);

        // type-checking comparison operator is necessary.
        if (strpos($input, '|') !== false) { 

            //VERTICAL SIGN FOUND
            list ($name,$params) = explode("|",$input);

            if (method_exists($this,$name)) {
                return $this->$name($params);
            }
            throw new Exception ("Unrecognised macro: {$name}.",500);

        } else {

            // Get the input string and request the data from constant table.
            $value = $this->constant->getRow($input)->value;

            // If there is a value returned from the contstant table.
            if($value !== null) { 

                // Return the what is returned from the the constant table.
                return $value;

            } else if(isset($property->$input)) { // If there is a customised value from the developer.

                // Return what is customised by the developer.
                return $property->$input;

            } else { // Nothing is found.

                // Return what is from the input.
                return "{{{$input}}}"; 

            }

        }   
    }

    /**
     * Replaces a YouTube curly
     * @param string $params
     * @return string
     */
    private function youtube ($params) {

        parse_str($params);

        // set defaults
        if (!isset($id)) { $id = "ykwqXuMPsoc"; }
        if (!isset($width)) { $width = 560; }
        if (!isset($height)) { $height = 315; }

        // output the final HTML
        return "<iframe width=\"{$width}\" height=\"{$height}\" src=\"http://www.youtube.com/embed/{$id}\" frameborder=\"0\" allowfullscreen></iframe>";
    }
}

2 个答案:

答案 0 :(得分:4)

怎么样:

public function replace ($input, $options = array()) {
    return preg_replace_callback(
        "/\{\{([a-z_]+(?:\|.+)?)\}\}/U",
        function($m) use($options) { return $this->_replace($m[1], $options); }, 
        $input
    );
}

答案 1 :(得分:-2)

否则使用 call_user_func_array

return preg_replace_callback(
    // RegExpr
    "/\{{2}(([a-z\_]+\|.+)|([a-z\_]+))\}{2}/Ue",

    // Callback
    array($this, '_replace'),

    // Data
    $input
);