2011-08-09 75 views
1

aren't變成aren’t和其他各種愚蠢。DOMDocument改變字符

這是代碼;這是在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刮。現在,我正在直接從數據庫處理值。我錯過了什麼? (DOMDoc甚至是這項工作的正確工具?)

更新 - 我仍然有問題,但有新的信息。

如果我直接從WordPress($ page-> post_content)打印/ echo/var_dump內容,則沒有問題。一旦它通過$ 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

檢查您的數據庫連接和表格歸類是否也是utf-8。您必須在整個系統中使用純UTF-8管道。如果任何地方的任何一個單獨的舞臺都是其他字符集,那麼您將會像這樣得到損壞的文本。 –

+0

與我可以看到的數據庫相關的所有內容(charset和collat​​ion)都是utf-8。 – Altari

+1

連接本身也必須是utf-8。嘗試使用'set names'utf-8'':http://dev.mysql.com/doc/refman/5.0/en/charset-connection。html –

回答

1

通過對the PHP documentation page for DOMDocument::loadHTML的評論,看起來loadHTML不尊重您可能在DOMDocument上設置的編碼。

取而代之,它會從HTML中的meta標籤中讀取它。在原始拼貼的情況下,我推測您正在處理包含元標記的完整頁面。

然而,據我所知,WordPress頁面的post_content只是一個文檔片段,而不是一個完整的HTML頁面(或者您是否改變了這一點?)。所以現在它不能從內容中找出編碼,並默認爲ISO 8859-1,並將所有內容都擰緊。更不用說它在片段周圍添加了doctype和htmlbody標籤等。

我不完全確定DOMDocument是否是正確的工具,但我不確定在你的情況下有什麼替代方法(顯然除了regular expressions)。

儘管如此,您可能會做的是在發佈內容前後包含一個簡單的HTML結構,包括元標記以確保它是UTF-8,然後將其傳遞到loadHTML()then use XPath to save just the body of it

+0

謝謝!我檢查了進入和出來的編碼,但沒有考慮它是如何處理它的。最終我用正則表達式(「所以現在我有兩個問題」,因爲我已經被告知),但是會記得在下一次我需要進行批量編輯時將它圍繞在適當的html中。 – Altari