防止HTMLPurifier和DOMDocument转换为Â

时间:2014-07-28 17:03:38

标签: php html tinymce domdocument htmlpurifier

我正在使用TinyMCE生成一些HTML。请注意,TinyMCE使用<p>&nbsp;</p>创建行间距。

然后我使用HTMLPurifier净化HTML。请注意,行间距将转换为<p> </p>

然后我使用PHP的DOMDocument执行一些DOM操作。我希望净化HTML执行DOM操作,并将进行更多修改,但只是显示下面的部分演示问题。请注意,行间距将转换为<p>Â </p>

为什么会这样?

我发现的两个解决方案是在执行DOM操作并在清除之前将Â替换为&nbsp并在清除之后替换回来之后剥离@nbsp。防止这种情况发生的最佳方法是什么?

//HTML created using TinyMCE and sent to server using jQuery Ajax Post
$message=trim($_POST['message']);
syslog(LOG_INFO,$message);
// Jul 28 09:39:24 devserver httpd: <p>Line 1</p>#012<p>&nbsp;</p>#012<p>Line 2</p>

$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.SerializerPath',VS_TEMPORARY_SITE);
$purifier = new HTMLPurifier($config);
$message=$purifier->purify($message);
syslog(LOG_INFO,$message);
//Jul 28 09:39:24 devserver httpd: <p>Line 1</p>#012<p> </p>#012<p>Line 2</p>

$doc = new DOMDocument();
$doc->loadHTML($message);
$body = $doc->getElementsByTagName('body')->item(0);
$message=$doc->saveHTML($body);    //Select the body tag
$message = str_replace(array('<body>', '</body>'), array('', ''), $message);  //strip the body tags
syslog(LOG_INFO,$message);
//Jul 28 09:39:24 devserver httpd: #012<p>Line 1</p>#012<p> </p>#012<p>Line 2</p>

1 个答案:

答案 0 :(得分:-1)

<p>Â </p>看起来像是一个字符集问题。实际上,当我写一个&nbsp;时,将其转换为UTF-8并将其打开为ISO 8859-1,我得到相同的结果。

您的PHP代码因此似乎生成UTF-8,并且您的浏览器显示ISO 8859-1。这会导致您的问题。您需要说服浏览器显示UTF-8,或者指示HTMLPurifier使用ISO 8859-1字符集输出。