$result = preg_replace(
"/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/iseU",
"CallFunction('\\1','\\2','\\3','\\4','\\5')",
$result
);
Run Code Online (Sandbox Code Playgroud)
上面的代码在升级到PHP 5.5后给出了弃用警告:
不推荐使用:preg_replace():不推荐使用/ e修饰符,而是使用preg_replace_callback
如何更换代码preg_replace_callback()?
我最近将PHP从5.3.27升级到5.5.0.在我的Symfony 2.3.2项目中一切正常,我可以享受最新的PHP功能.
现在当我回到我的其他Symfony 1.4.16项目时,我得到一个关于preg_replace被/ e修饰符弃用的PHP错误.
我在论坛中找不到关于此错误的参考:以前是否有人遇到此问题?有什么样的补丁我可以开箱即用吗?升级到Symfony 1.4.20会解决这个问题吗?
错误消息如下所示:
不推荐使用:preg_replace():不推荐使用/ e修饰符,而是在第409行的/myproject/lib/vendor/symfony/lib/response/sfWebResponse.class.php中使用preg_replace_callback
一种方法可能是按照消息和手册中的建议修改代码.如何将preg_replace表达式更改为preg_replace_callback调用?
任何帮助/提示都将非常受欢迎.
编辑:
到目前为止,还没有补丁(Symfony 1.4.20没有解决这个问题).解决方案是将对preg_replace的失败调用替换为在sourche中对preg_replace_callback的相应调用,这很容易在sfWebResponse类中完成(感谢提示Jon).不幸的是,现在下一次失败的情况稍微复杂一些......另一方面,我们可能不得不使用/ e选项grep for preg_replace使用以找出Symfony可能会破坏的位置.这给出了不少结果:o
所以...我的结论是Symfony 1.4用户最好不要将PHP升级到5.5版,直到出现一些严重的补丁.你怎么看 ?还有其他选择
如何用另一部分替换我的字符串的某个部分?
输入字符串:
"Hello, my name is Santa"
Run Code Online (Sandbox Code Playgroud)
如何a用其他东西改变我的字符串中的所有内容?
我想我需要一个foreach循环,但我不确定如何使用它.
我目前正在提高我对HTML,PHP,JavaScript等安全漏洞的了解.几个小时前,我/e在正则表达式中偶然发现了修饰符,但我仍然无法理解它是如何工作的.我已经看了一下文档,但这并没有真正帮助.
我理解的是,可以操纵此修饰符以使某人有机会执行PHP代码(例如,preg_replace()).我已经看到以下示例描述了一个安全漏洞,但没有解释,所以有人可以解释一下如何调用phpinfo()以下代码吗?
$input = htmlentities("");
if (strpos($input, 'bla'))
{
echo preg_replace("/" .$input ."/", $input ."<img src='".$input.".png'>", "bla");
}
Run Code Online (Sandbox Code Playgroud) 有一个单引号字符串:
$content = '\tThis variable is not set by me.\nCannot do anything about it.\n';
Run Code Online (Sandbox Code Playgroud)
我想inerpret /处理字符串,好像它是双引号.换句话说,我想用实际值替换所有可能的转义字符(不仅仅是tab和linefeed,如本例所示),同时考虑到反斜杠也可能被转义,因此'\n'需要被替换由'\n'.eval()很容易做我需要的但我无法使用它.
有一些简单的解决方案吗?
(我发现一个类似的线程处理单引号字符串中变量的扩展,而我在替换转义字符后.)
$source = preg_replace('/&#(\d+);/me', "utf8_encode(chr(\\1))", $source);
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了不建议使用的警告。
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in
Run Code Online (Sandbox Code Playgroud)
如何将preg_replace()替换为preg_replace_callback()?
有人可以帮我解决这个错误吗?
警告:preg_replace():不再支持 /e 修饰符,请改用 preg_replace_callback
我的原始代码:
$match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
Run Code Online (Sandbox Code Playgroud)
所以我这样试过:
$match[1] = preg_replace_callback('/(?<=^|[\x09\x20\x2D])./e',
function ($matches) {
foreach ($matches as $match) {
return strtoupper($match);
}
},
strtolower(trim($match[1])));
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到同样的错误:
警告:preg_replace_callback():不再支持 /e 修饰符,请改用 preg_replace_callback