вторник, 20 июня 2017 г.

Кодировка для DOMDocument

Сегодня покажу вам, ребята, немного "костыликов" при работе с xml и xpath.

Допустим, откуда-то издалека вы получаете кусок html-разметки и дальше ее парсите, вытягивая заголовки, какие-нибудь абзацы текстов и прочие слова. Как только вы все полученные данные захотите вывести - может произойти так что на странице вместо текста будут всем известные кракозябры. В чем же дело? А дело в том, что при создании объекта DOMDocument вы не указали кодировку, в которой пришли данные. Ну и так как вы это не указали, то DOMDocument подумал, что данные пришли скорее всего в ISO-8859-1.

Само собой это надо быстренько исправить. И написать вот так:

// Создаем объект
$dom = new DOMDocument('1.0', 'utf-8');

// Ваша строка с HTML-разметкой
$stringToParse = "......";

// Загружаем строку в DOMDocument, ЯВНО указывая ее кодировку
$dom->loadHTML('<?xml encoding="utf-8"?>' . $stringToParse);

// Делаем xpath-запрос, например
$xpath = new DOMXPath($dom);
$ps = $xpath->query('//p');

Причем абсолютно неважно как выглядит строка с html-разметкой - один ли там корневой элемент или несколько, DOMDocument сделает все как надо.

Еще один костылик при работе с DOM-парсером xml - это собственная обработка ошибок, возникающих при парсинге. Для этого используются следующие функции, например так:

// Передачей параметра true мы включаем обработку ошибок пользователем
libxml_use_internal_errors(true);

// Создаем новый объект
$doc = new DOMDocument;

// Пытаемся загрузить какой-то xml
if (!$doc->load('file.xml')) {
    // Если есть желание - можно оповестить пользователя об ошибках
    foreach (libxml_get_errors() as $error) {
        print_r($error);
    }

    // А если желания нет - то и не надо
    // Просто очищаем текущие собранные ошибки и живем дальше
    libxml_clear_errors();
}

Комментариев нет:

Отправить комментарий