вторник, 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 сделает все как надо.