写了一篇文章,用<pre>标签包了一段代码,结果u'\xc9\xab'这样的代码里反斜线\自动消失了。这个事以前也碰到过,直接把反斜线打了两遍,发布文章后就会变成一个了,不过修改文章时,那一个反斜线又消失了。今天认真地查了一下,在WordPress源代码里逛得头晕,于是到WordPress Trac里拿"backslash"做关键词搜了一下,找到了3个月前有人报的bug:backslash disappears in <pre>。8月26号报的bug,现在也不处理,唉。
按照他的提示,在/wp-includes/functions-formatting.php文件里找到了wpautop()函数中的这句$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') . stripslashes(clean_pre('$2')) . '</pre>' ", $pee);。按照PHP文档里stripslashes()函数的说明,它应该是剥去单引号、双引号以及反斜线之前的那个反斜线,不过实际操作中,这个函数好像把每个字符前面的反斜线都给剥去了。
这事好像很麻烦,好像PHP文档并没有说清楚,而众多PHPer都误用了。下面的一条留言里提到:"If you want to deal with slashes in double-byte encodings, such as shift_jis or big5, you may use this"双字节的编码,除了ASCII和欧洲的那几个,其他的不都是双字节编码?晕倒了。
照着他的函数修改了一下,得到下面的函数:
function stripslashes2($string) {
$string = str_replace(array("\\\\\\"","\\\\'","\\\\\\\\"),array("\"","'","\\\\"), $string);
return $string;
}
然后,把第83行的stripslashes(clean_pre('$2'))改成stripslashes3(clean_pre('$2'))就可以了。
正想要照著做的時候,最後的函數變成 stripslashes3 ?應該是手誤吧?
做测试时,拿原始的stripslashes,从PHP文档里抄来的stripslashes2函数,我修改过的stripslashes3,3个函数一起测试效果。写文章时,代码里改了,下面的忘记了,嘿嘿。
受教了!
很多PHP程序也存在这个问题,究其原因,stripslashes()是和addslashes()配对使用的,它只是简单的删除了里面所有反斜杠,而不去判断实际内容。在配对使用的时候,处理是完全正确的。但是单独使用,结果是不对的。
是 array("\"","'","\\") ,前面的那个双引号得转义。^_^