WordPress的pre标签内反斜线丢失问题

写了一篇文章,用<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'))就可以了。

本文共有 8 条评论WordPress的pre标签内反斜线丢失问题


  1. 1 Kirin Lin

    正想要照著做的時候,最後的函數變成 stripslashes3 ?應該是手誤吧? ;)

  2. 2 yskin

    做测试时,拿原始的stripslashes,从PHP文档里抄来的stripslashes2函数,我修改过的stripslashes3,3个函数一起测试效果。写文章时,代码里改了,下面的忘记了,嘿嘿。

  3. 3 剧情介绍

    受教了!

  4. 4 浅水游

    很多PHP程序也存在这个问题,究其原因,stripslashes()是和addslashes()配对使用的,它只是简单的删除了里面所有反斜杠,而不去判断实际内容。在配对使用的时候,处理是完全正确的。但是单独使用,结果是不对的。

  5. 5 SilverFox

    是 array("\"","'","\\") ,前面的那个双引号得转义。^_^

  1. 1 BloggingPro China » WordPress的<pre>标签内反斜线丢失问题
    Pingback2006-11-30 7:48 下午
  2. 2 [2006/11/29 - 2006/12/06] « Kirin Lin
    Pingback2006-12-6 11:35 上午
  3. 3 mYYu.宇 » Blog Archive » 标签
    Pingback2007-2-5 10:09 下午

请留下您的评论: