转换:“preg_replace” - > “preg_replace_callback”

时间:2014-03-25 14:35:26

标签: rewrite preg-replace deprecated preg-replace-callback

我正在尝试更新我的代码,但我仍然坚持使用此代码。

如何将此转换为preg_replace_callback?

$buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);

1 个答案:

答案 0 :(得分:1)

以下是将preg_replace(使用e修饰符)转换为preg_replace_callback的过程。您创建一个将对其找到的所有匹配项执行操作的函数。通常这很简单,但是对于你的情况,它会稍微复杂一点,因为函数返回一个对象的值。为了适应这种情况,您可以使用匿名函数(没有名称的函数)并将USE关键字与您的对象相关联。这可以内联完成,但是为了清楚起见,我已经使它成为自己的变量。

请看下面完整代码的这一部分:

$callback_function = function($m) use ($templ) {

我创建了一个名为callback_function的变量,该变量将在preg_replace_callback函数中使用。此功能将自动为每个匹配作为变量$m。因此,在函数中,您可以使用$m[1]$m[2]来访问匹配的表达式部分。另请注意,我已将$templ变量与USE关键字相关联,以便$templ在该函数中可用。

希望这是有道理的。无论如何,这是完整的代码:

<?php

// SET THE TEXT OF THE BUFFER STRING
$buffer = 'There are a bunch of §guns.roses growing along the side of the §guns.road.';

// THIS IS JUST A SAMPLE CLASS SINCE I DO NOT KNOW WHAT YOUR CLASS REALLY LOOKS LIKE
class Test {

    // FUNCTION NAMED 'guns' WITH A SPACE FOR A PARAMETER
    public function guns($info) {
        return '<b>BLUE '.strtoupper($info).'</b>';
    }

}

// INSTANTIATE A NEW 'Test' CLASS
$templ = new Test();

// THIS IS THE FUNCTION THAT YOUR CALLBACK WILL USE
// NOTICE THAT IT IS AN ANONYMOUS FUNCTION (THERE IS NO FUNCTION NAME)
$callback_function = function($m) use ($templ) {
    return $templ->$m[1]($m[2]);
};

// THIS USES PREG_REPLACE_CALLBACK TO SUBSTITUTE OUT THE MATCHED TEXT WITH THE CALLBACK FUNCTION
$buffer = preg_replace_callback('/§([a-z0-9-_]+)\.?([a-z0-9-_]+)?/i', $callback_function, $buffer);

// PRINT OUT THE FINAL VERSION OF THE STRING
print $buffer;

这输出以下内容:

There are a bunch of <b>BLUE ROSES</b> growing along the side of the <b>BLUE ROAD</b>.