无法将带有修饰符 /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()的主要内容,如果未能解决你的问题,请参考以下文章
关于thinkhphp3.1中废弃 preg_replace /e 修饰符
mpdf 错误 - preg_replace(): /e 修饰符已弃用,请改用 preg_replace_callback