使用DOMDocument剪切HTML会输出无效字符

时间:2014-11-10 04:03:54

标签: php html domdocument

我正在使用PHP中的DOMDocument类来剪切几行文本。这里的文本是一个由WYSIWYG编辑器输入的大块HTML。

我用来做的代码是这样的:

$body_string .= '<p class="summary">';

$domd = new DOMDocument();
$domd->encoding = 'utf-8';
libxml_use_internal_errors(true);
$domd->loadHTML(utf8_decode($post['content']));
libxml_use_internal_errors(false);

$domx = new DOMXPath($domd);
$items = $domx->query("//p[position() = 1] | //div[position() = 1]");

$body_string .= substr($items->item(0)->textContent, 0, 230);
$body_string .= '</p>

但是,当字符串具有特殊字符(如省略号或引号)时,它们会变成问号。

所以这样的文字:

  

我们知道,TED演讲有时候会让人觉得有点过分夸大其词。在那里时   有很多很棒的会谈;其中一些无处可去,似乎没有   在你的生活中添加很多东西。让事情变得更糟......有很多   TED谈话,很难说

变成了这个:

  

我们知道,TED演讲有时候会有点感觉吗?夸大了。在那里时   有很多很棒的会谈;他们中的一些人无处可去,似乎没有   在你的生活中添加很多东西。让事情变得更糟?有很多的   TED谈话,很难说

只有在我使用DOMDocument类时才会发生这种情况。没有它,字符就不会转换为问号。

我该如何解决这个问题? HTML文档在<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

中已有<head>

2 个答案:

答案 0 :(得分:1)

似乎无法重现那个,而是尝试这种解决方法:

$body_string .= '<p class="summary">';

$domd = new DOMDocument('1.0', 'utf-8');
libxml_use_internal_errors(true);
$domd->loadHTML(mb_convert_encoding($post['content'], 'HTML-ENTITIES', 'UTF-8'));
libxml_clear_errors();

$domx = new DOMXPath($domd);
$items = $domx->query("//p[position() = 1] | //div[position() = 1]");

$body_string .= substr($items->item(0)->textContent, 0, 230);
$body_string .= '</p>

Sample Output

最近可重复的东西。

答案 1 :(得分:0)

设置DOMDocument::encoding仅对在将DOMDocument打印为字符串时更改编码很有用,因此不会产生任何影响。

同样,在DOMDocument构造函数中设置'utf-8'也没有效果,因为它仅在从头开始创建新文档时使用,而不是在解析现有文档时使用。

HTML解析器需要知道发布内容的编码是什么,如下所示:

$domd = new DOMDocument();
libxml_use_internal_errors(true);
$domd->loadHTML('<meta charset="utf-8">' . $post['content']);
libxml_use_internal_errors(false);