preg_replace使用函数的返回值作为替换

时间:2011-06-02 22:30:46

标签: php preg-replace

我有以下代码:

$message = preg_replace($pattern, "$this->get_bitly_url('$0')", $message);

function get_bitly_url($url) {
    // do stuff to get the url

    return $newurl;
}

我想将匹配替换为同一类中函数get_bitly_url()的返回值。

但是我收到了以下错误:

Notice: Undefined property: MyClass::$get_bitly_url in /path/to/MyClass.php on line 43

所以我改为使用preg_replace:

$message = preg_replace($pattern, "self::get_bitly_url('$0')", $message);

这有效,但我想知道这是否是正确的方法。

所以......是吗?

3 个答案:

答案 0 :(得分:2)

不,绝对不是:)。使用preg_replace_callback:http://php.net/manual/en/function.preg-replace-callback.php

答案 1 :(得分:1)

使用单引号,否则PHP会过早地评估$this->

$message = preg_replace($pattern, '$this->get_bitly_url("$0")',

您需要在此处将包含表达式的字符串传递给preg_replace。但是,如果它是双引号,则在之前将 评估为 字符串表达式,它将成为函数参数。

答案 2 :(得分:1)

假设您使用的是PHP5.3或更高版本,可以使用:

$myObject = $this;
$message = preg_replace_callback($pattern, function($matches) use($myObject) {
    return $myObject->get_bitly_url($matches[0]);
}, $message);

使用以前的版本,您可以在其他地方定义函数,并将函数名称作为字符串传递给preg_replace_callback,但速度较慢。