无法将带有修饰符 /e 的 preg_replace() 转换为 preg_replace_callback()

Posted

技术标签:

【中文标题】无法将带有修饰符 /e 的 preg_replace() 转换为 preg_replace_callback()【英文标题】:Can't convert preg_replace() with modifier /e to preg_replace_callback() 【发布时间】:2015-07-31 09:26:10 【问题描述】:

我正在使用preg_replace()#page 替换为变量$page 的实际值。当然我有很多#variable,而不仅仅是#page

例如:

$uri = "module/page/#page";
$page = 3;

//preg_replace that its working now
$uri_to_call = $uri_rule = preg_replace('/\\#([A-Za-z_]+)\/e', "$$1", $uri);

我得到了结果

"module/page/3";

更新到 php 5.4 后出现错误:

不推荐使用:preg_replace():不推荐使用 /e 修饰符,请改用 preg_replace_callback

而且我不知道如何用preg_replace_callback() 重写preg_replace()

我已尝试关注 SO Replace preg_replace() e modifier with preg_replace_callback 的回答

像这样:

public static function replace_vars($uri)  //$uri_rule = preg_replace('/\\#([A-Za-z_]+)\/e', "$$1", $uri);
        return preg_replace_callback('/\#([A-Za-z_]+)\/', 
           create_function ('$matches', 'return $$matches[1];'), $uri);

    

但我也收到警告:

注意:未定义变量:页面

这实际上是正确的,因为页面变量没有设置运行时创建的函数。

谁能帮帮我?

【问题讨论】:

@Rizier123 我相信这个问题在编辑后不会重复 您的问题是,在您的匿名函数中,变量变量超出范围 @Rizier123 我知道变量 $page 和所有其他变量都是动态变量。所以我必须有一种方法将“变量 #page”替换为 $page 的值。谢谢跨度> 那么这个问题我们现在在哪里? 【参考方案1】:

您的问题是您已经知道,您的变量超出了匿名函数的范围,并且由于您不知道将替换哪个变量,因此您无法将它们传递给函数,因此您必须使用global关键字,例如

$uri = "module/page/#page";
$page = 3;

$uri_to_call = $uri_rule = preg_replace_callback("/\\#([A-Za-z_]+)\/", function($m)
    global $$m[1];
    return $$m[1];
);

【讨论】:

这比你的建议复杂得多,但主要负责人帮助我解决它。谢谢

以上是关于无法将带有修饰符 /e 的 preg_replace() 转换为 preg_replace_callback()的主要内容,如果未能解决你的问题,请参考以下文章

替代函数 preg_replace e/ 修饰符

关于thinkhphp3.1中废弃 preg_replace /e 修饰符

php新版本号废弃 preg_replace /e 修饰符

mpdf 错误 - preg_replace(): /e 修饰符已弃用,请改用 preg_replace_callback

警告:preg_replace():未知修饰符“h”

未知修饰符 '/' preg_replace()