Почему разбор php DOM влияет на кодировку? - PullRequest
0 голосов
/ 04 октября 2009
$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$elements = $dom->getElementsByTagName('span');
$spans = array();
foreach($elements as $span) {
    $spans[] = $span;
}
foreach($spans as $span) {
    $span->parentNode->removeChild($span);
}
return $dom->saveHTML();    
//return $string;

Когда я использую этот код для разбора строки, он изменяет кодировку, и символы не отображаются одинаково, когда return $string не комментируется. Почему это так и как избежать смены кодировки

Ile

Ответы [ 3 ]

2 голосов
/ 04 октября 2009

Попробуйте установить кодировку в конструкторе или с помощью DOMDocument->encoding:

$dom = new DOMDocument('1.0', '…');
// or
$dom = new DOMDocument();
$dom->encoding = '…';
1 голос
/ 04 октября 2009

К сожалению, похоже, что DOMDocument автоматически преобразует все символы в объекты HTML, если только ему не известна кодировка исходного документа.

По-видимому, одним из вариантов является добавление тега <meta> с типом содержимого / кодировкой к исходной строке, но это означает, что он также будет присутствовать в выводе. Удалить его может быть не так просто.

Другой вариант, о котором я могу подумать, - это ручное декодирование HTML-сущностей с использованием кода, подобного следующему:

$trans = array_flip(get_html_translation_table(HTML_ENTITIES));
unset($trans["&quot;"], $trans["&lt;"], $trans["&gt;"], $trans["&amp;"]);
echo strtr($dom->saveHTML(), $trans);

Это серьезно уродливое решение, но я не могу думать ни о чем другом, кроме как использовать другой анализатор HTML. (

0 голосов
/ 05 октября 2009

Есть еще одна интересная вещь, которую я заметил сегодня ... Я не понял, почему это происходит, но это очень странное поведение ... Код сверху настроен на работу. Когда строка передается в функцию и после обработки функции к возвращаемой строке добавляется <doctype...> <html><body>STRING</body></html> в некоторых необъяснимых случаях: Данные загружаются из базы данных, и когда эти данные из базы данных напрямую передаются в функцию, они не добавляют эти дополнительные теги, но когда данные сначала сохраняются в переменную, а затем эта функция вызывается где-то ниже, эти дополнительные значения добавляются. Также одна странная вещь ... У меня был случай, когда я вызывал эту дополнительную функцию для обработки строки, и несколькими строками ниже я добавил функцию обрезки, она возвращала мне ошибку из функции dom ... и когда я удалял эту функцию обрезки (которая называлась ПОСЛЕ функции dom), ошибка исчезала ... Есть разумное объяснение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...