我正在尝试更新我的代码,但我仍然坚持使用此代码。
如何将此转换为preg_replace_callback?
$buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);
答案 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>.