aren't
变为aren’t
以及其他各种愚蠢行为。
这是代码;这在WordPress中可以自动从几百个帖子中删除一个元素。
function removeImageFromPages() {
$pages = get_pages(array('exclude' => '802,6,4'));
foreach($pages AS $page) {
if($page->post_content == '') { continue; }
$doc = new DOMDocument('1.0', 'UTF-8');
$post_content = stripslashes($page->post_content);
@$doc->loadHTML($post_content);
$content = $doc->saveXML();
echo($content); exit;
}
}
最初我正在操作的帖子内容存储在自定义CMS中。 初始 scrape是使用DOMDoc完成的,没有任何编码问题。然而,第二次似乎有某种麻烦。所有标题都设置为UTF-8,但我对编码不是很有经验。这是第一次,它是纯粹的HTML scrape。现在,我正在直接从数据库处理值。我错过了什么? (DOMDoc甚至是这项工作的合适工具吗?)
更新 - 我仍然遇到问题,但有新信息。
如果我直接从WordPress打印/ echo / var_dump内容($ page-> post_content),则没有问题。一旦通过$ doc-> saveXML或$ doc-> saveHTML,字符就会变得混乱。但是,他们并没有变得混乱。
$doc->loadHTML($page->post_content);
echo($doc->saveXML());
收益率aren’t
。然而
$doc->loadHTML($page->post_content);
$ps = $doc->getElementsByTagName('p');
echo($ps->item(3)->nodeValue);
echo($doc->saveXML($ps->item(3)));
收益arenât
(在两个回声中)。
另外,如果我将文档中的字符串直接复制/粘贴到函数中,它可以完美地工作。只有在处理从WordPress传递的值时才会这样。
答案 0 :(得分:1)
通过the PHP documentation page for DOMDocument::loadHTML上的评论,loadHTML
似乎不尊重您在DOMDocument
上设置的编码。
相反,它会从HTML中的meta
标记中读取它。通过原始的抓取,我认为你正在处理完整的页面,包括元标记。
WordPress页面的post_content
,据我所知,只是一个文档片段,而不是一个完整的HTML页面(或者你改变了吗?)。所以现在它无法从内容中找出编码,默认为ISO 8859-1并且搞砸了所有内容。更不用说它在片段周围添加了doctype和html
以及body
标签等。
我不完全确定DOMDocument在这里是否是正确的工具,但我不确定在你的情况下有什么替代方案(显然除了regular expressions之外)。
但是,您可以做的是在帖子内容周围包含一个简单的HTML结构,包括一个元标记以确保它是UTF-8,然后再将其传递给loadHTML()
和then use XPath to save just the body of it