Почему анализ php DOM влияет на кодировку?

$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 uncommented. Почему это так и как избежать изменения набора символов

Ile

К сожалению, кажется, что 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. 🙁

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

 $dom = new DOMDocument('1.0', '…'); // or $dom = new DOMDocument(); $dom->encoding = '…'; 

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