mik*_*ika 18 php preg-replace preg-replace-callback symfony-1.4
我最近将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版,直到出现一些严重的补丁.你怎么看 ?还有其他选择
flm*_*flm 37
除非您在index.php中启用了调试,否则错误不会显示在prod中.也可以通过在settings.yml中取消设置 E_DEPRECATED标志来删除它们:
dev:
.settings:
error_reporting: <?php echo ((E_ALL | E_STRICT) ^ E_DEPRECATED)."\n" ?>
Run Code Online (Sandbox Code Playgroud)
Jon*_*Jon 13
基本上你要做的就是从preg_replace调用中取出替换参数并将其分解为正确的PHP表达式,然后将该表达式作为函数的主体,将其用作等效preg_replace_callback调用的回调.
在您的情况下,相关的代码是
return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", /* input */)
Run Code Online (Sandbox Code Playgroud)
所以你会这样做
$callback = function($matches) {
return '-'.strtoupper($matches[1]);
};
return preg_replace_callback('/\-(.)/', $callback, /* input */)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,回调代码与原始替换表达式相同,唯一的区别是诸如的\\1数组之类的引用被替换为$matches[1].
mik*_*ika 11
总而言之,最好的解决方案是避免将PHP升级到5.5版,因为它与Symfony 1.4不兼容
如果您同时Symfony的2和1.4版本在开发环境中,您可能希望能够切换你的PHP版本,很好地描述了这里.
如果你真的需要,可以在同一个Apache服务器上同时设置两个不同版本的PHP:这需要更多的配置,上面的链接也解释了这一点.
替代HOT FIX:
通过Symfony代码中的几个更新,我可以在dev中运行我的大部分网页.当然,在生产中应用它会很危险,因为"弃用"错误可能随时再次出现,这是由另一个Symfony库引起的.
在第409行的myproject/lib/vendor/symfony/lib/response/sfWebResponse.class.php中,我现在(已注释的代码是原始的Symfony代码):
protected function normalizeHeaderName($name)
{
// return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));
return preg_replace_callback(
'/\-(.)/',
function ($matches) {
return '-'.strtoupper($matches[1]);
},
strtr(ucfirst(strtolower($name)), '_', '-')
);
}
Run Code Online (Sandbox Code Playgroud)
在第362行的myproject/lib/vendor/symfony/lib/util/sfToolkit.class.php中,我们得到:
public static function pregtr($search, $replacePairs)
{
// return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search);
foreach($replacePairs as $pattern => $replacement)
$search = preg_replace_callback(
$pattern,
function ($matches) use ($replacement){
if(array_key_exists(1, $matches)){ $replacement = str_replace("\\1", $matches[1], $replacement);}
if(array_key_exists(2, $matches)){ $replacement = str_replace("\\2", $matches[2], $replacement);}
return $replacement;
},
$search
);
return $search;
}
Run Code Online (Sandbox Code Playgroud)
使用风险自负:)
use*_*395 11
第407行/lib/vendor/symfony/lib/response/sfWebResponse.class.php中的normalizeHeaderName方法的FIX
protected function normalizeHeaderName($name)
{
//return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')",
strtr(ucfirst(strtolower($name)), '_', '-');
return str_replace(array('\'$1$3\'','\'$2$4\'','\'$1\'', '\'$2\'', '$1', '$2'),array('$matches[1].$matches[3]','$matches[2].$matches[4]','$matches[1]','$matches[2]','$matches[1]','$matches[2]'),
$name);
}
Run Code Online (Sandbox Code Playgroud)
第360行/lib/vendor/symfony/lib/util/sfToolkit.class.php中的pregtr方法的FIX
public static function pregtr($search, $replacePairs){
// return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search);
foreach($replacePairs as $pattern => $replacement)
{
if (preg_match('/(.*)e$/', $pattern, $matches))
{
$pattern = $matches[1];
$search = preg_replace_callback($pattern, function ($matches) use ($replacement) {
preg_match("/('::'\.)?([a-z]*)\('\\\\([0-9]{1})'\)/", $replacement, $match);
return ($match[1]==''?'':'::').call_user_func($match[2], $matches[$match[3]]);
}, $search);
}
else
{
$search = preg_replace($pattern, $replacement, $search);
}
}
return $search;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
360行上的/ lib / vendor / symfony / lib / util / sfToolkit.class.php中的pregtr方法的替代FIX
public static function pregtr($search, $replacePairs)
{
// return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search);
foreach($replacePairs as $pattern => $replacement)
{
if (preg_match('/(.*)e$/', $pattern, $matches))
{
$pattern = $matches[1];
$search = preg_replace_callback($pattern, function ($matches) use ($replacement) {
preg_match("/('::'\.)?([a-z]*)\('\\\\([0-9]{1})'\)/", $replacement, $match);
return ($match[1]==''?'':'::').call_user_func($match[2], $matches[$match[3]]);
}, $search);
}
else
{
$search = preg_replace($pattern, $replacement, $search);
}
}
return $search;
}
Run Code Online (Sandbox Code Playgroud)