2013-09-23 24 views
0

为了逃避双或单引号,我用正则表达式反向引用:PHP中的反向引用preg_replace()不稳定?

$strVal = '<div class="xclassname">Contents</div>'; 
$strVal = preg_replace("/([\"\'])/", "\\\\1", $strVal); 

这通常给了我这个字符串(因为岁):

"<div class=\"xclassname\">Contents</div>" 

用双引号正确转义C++风格。

但今天我的PHP 5.5.3给了我这样的结果:

"<div class=\1xclassname\1>Contents</div>" 

与坏\ 1串换成了双引号。

现在我必须使用此:

$strVal = preg_replace("/([\"\'])/", "\\\\\${1}", $strVal); 

的preg_replace()是在我的Windows 7操作系统不稳定,有时它给一个结果,其他的日子就给出了另一个?

请问您是否遇到过这种情况,为什么?

新增:

我忘了,我们已经更新了PHP 5.3之前PHP5.5.3几个星期,preg_repace()根据PHP的版本是不稳定的,而不是在日期时间函数:

preg_replace("/([\"\'])/", "\\\\1", $strVal); // is OK for PHP5.3.x, but 
preg_replace("/([\"\'])/", "\\\\1", $strVal); // is bad for PHP5.5.x. 
preg_replace("/([\"\'])/", "\\\\\${1}", $strVal); // is good for PHP5.5.x. 

就是这样,我没有多个版本的PHP,你能确认吗?

+3

最简单/最佳答案:不要使用正则表达式来处理html/xml。 preg_replace不是不稳定的。它确实如此。如果你得到不同的结果,那么你的系统配置会改变 - 例如安装了多个PHP版本。 –

+0

''\\\ $ 1''可能会是一个简单的替换FYI – SmokeyPHP

+0

此外,反向引用倾向于在正则表达式中是'\#',然后是替换中的'$#'(对于PHP funcs) - 其中'#'是组号 – SmokeyPHP

回答

2

preg_*功能首先与$1效果更好,建议您使用它们。这就是说,为什么不使用addslashes来完成这项任务?

+0

“首位1美元”,这个不清楚,请举个例子吗? – jacouh

+0

经过测试,addslashes()确实做得很好,preg_replace()也是。 – jacouh