从 preg_replace 到 preg_replace_callback
Posted
技术标签:
【中文标题】从 preg_replace 到 preg_replace_callback【英文标题】:FROM preg_replace TO preg_replace_callback 【发布时间】:2014-04-27 02:59:06 【问题描述】:各位网友大家好!
我在将一些旧函数更新为 preg_replace_callback 时遇到问题。 编辑:我做错了什么?
这是我的第一个(preg_replace/deprecated)函数:
if ($handle)
while (!feof($handle))
$buffer = fgets($handle, 4096);
@eval('$templ = new '.TEMPL_CLASS.';');
$buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);
$out .= $buffer;
fclose($handle);
第二个函数(这是我尝试转换为 preg_replace_callback):
if ($handle)
while (!feof($handle))
$buffer = fgets($handle, 4096);
@eval('$templ = new '.TEMPL_CLASS.';');
$buffer = preg_replace_callback(
'#§([\w-]+)\.?([\w-]+)?#',
function ($m)
@$templ->$m[1]($m[2]);
,
$buffer
);
$out .= $buffer;
fclose($handle);
老了! M42的回答修复了以下错误:
警告:preg_replace_callback():修饰符 /e 不能与 第 52 行 /var/www/inc/engine.php 中的替换回调
); <-- line 52
$out .= $buffer;
编辑:我不知道如何处理这个渲染部分..
$buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);
现在它正在呈现一个空白页面..我猜错误在
返回模板($m[1], $m[2]);
【问题讨论】:
抱歉,有什么问题? 哦,感谢您的关注!我不知道我在尝试中做错了什么(第二个代码块) 好的,您遇到错误了吗?如果有,它们是什么?请将它们添加到问题中,这将使我们更容易为您提供帮助。 抱歉.. 我刚刚将错误添加到我的原始帖子中 :) 感谢您抽出宝贵时间解决我的问题 【参考方案1】:正如消息中所说,删除了e
修饰符:
'#§\\(\\[a-z0-9-_\\]+\\)\.?\\(\\[a-z0-9-_\\]+\\)?#i'
// here ___^
而且没有必要转义所有这些字符:
'#§([a-z0-9_-]+)\.?([a-z0-9_-]+)?#i'
[a-z0-9_]
可以改写为\w
,不需要i
修饰符
'#§([\w-]+)\.?([\w-]+)?#'
整个指令变成:
$buffer = preg_replace_callback(
'#§([\w-]+)\.?([\w-]+)?#',
function ($m)
return templ($m[1], $m[2]);
,
$buffer
);
【讨论】:
效果很好!至少它给了我一个新的错误。抱歉,我还不能投票给你,我需要更多的代表 现在它抛出了我:警告:preg_replace_callback() 至少需要 3 个参数,2 个在 /var/www/inc/engine.php 第 52 行给出 @mlv:我已经编辑了整个指令。它对我来说很好用。可能是你用错了。 谢谢!它不起作用,因为我试图将 templ 作为变量而不是函数返回...返回 @templ ... 这并不能解决问题,只是那个错误(谢谢你帮助我)以上是关于从 preg_replace 到 preg_replace_callback的主要内容,如果未能解决你的问题,请参考以下文章
PHP php使用preg_replace从文本中删除特殊字符
如何将 % 添加到以下 preg_replace 代码及其工作原理
preg_replace、preg_replace_callback 和数组到字符串的转换