我正在使用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>
答案 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>
最近可重复的东西。
答案 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);