DOMDocument更改字符

时间:2011-08-09 15:44:02

标签: php wordpress domdocument

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传递的值时才会这样。

1 个答案:

答案 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