DOMDocument смена персонажей - PullRequest
       16

DOMDocument смена персонажей

1 голос
/ 09 августа 2011

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.Начальная очистка была сделана с DOMDoc, без каких-либо проблем с кодированием.Однако во второй раз, похоже, возникли какие-то проблемы.Все заголовки во всем установлены как UTF-8, но я не очень разбираюсь в кодировании.В первый раз это была чистая HTML-царапина.Теперь я имею дело со значениями непосредственно из базы данных.Что мне не хватает?(И является ли DOMDoc даже подходящим инструментом для этой работы?)

Обновление - у меня все еще есть проблема, но есть новая информация.

Если я печатаю / echo / var_dump содержимое напрямуюиз WordPress ($ 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 Ответ

1 голос
/ 09 августа 2011

Просматривая комментарии на странице документации PHP для DOMDocument :: loadHTML , выясняется, что loadHTML не соответствует кодировке, которую вы могли установить на DOMDocument.

* 1006.* Вместо этого он будет читать его из тега meta в HTML.Исходя из оригинального анализа, я предполагаю, что вы имели дело с полными страницами, включая метатеги.

post_content страницы WordPress, однако, насколько я знаю, это всего лишь фрагмент документа, а не полный HTMLстраница (или вы это изменили?).Так что теперь он не может выяснить кодировку из содержимого и по умолчанию ISO 8859-1 и все испортил.Не говоря уже о том, что он добавляет doctype и теги html и body и т. Д. Вокруг фрагмента.

Я не совсем уверен, является ли DOMDocument подходящим инструментом, но я не уверен, чтоальтернативы в вашем случае (кроме регулярных выражений , очевидно).

Что вы, вероятно, можете сделать, это обернуть простую структуру HTML вокруг содержимого публикации, включая метатег дляубедитесь, что это UTF-8, прежде чем передать его в loadHTML() и , затем используйте XPath, чтобы сохранить только его тело .

...