$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["""], $trans["<"], $trans[">"], $trans["&"]); 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) ошибка исчезла … Любое разумное объяснение?