Intereting Posts
Как проверить два условия перед вставкой? Экспортировать «запрос» из «mysqli-> prepare» Закрытие в PHP … что, собственно, они и когда вам нужно их использовать? Редактирование пользователя с ошибкой неверно изменяет имя пользователя app.user.username, как его решить? Laravel – ввод формы – множественный выбор для отношения одного к другому Как удалить index.php из codeigniter в UBUNTU отображать данные из двух таблиц Mysql, получая значения из выпадающего списка, используя php Преобразование PDF в строку php доступ к атрибутам в json apns-php отправка push-уведомлений с использованием профиля производства PHP DateTime __construct () Не удалось проанализировать строку времени (xxxxxxxx) в позиции x Лучший способ обработки динамического количества полей формы в PHP? Контроллер нагрузки CodeIgniter из вида В DDD и CQRS для запросов на чтение, что такое стратегия, которая позволяет использовать интерфейсы и простое тестирование? PHP. Проверьте, выполняется ли страница в браузере Mobile или Desktop.

DomDocument и специальные символы

Это мой код:

$oDom = new DOMDocument(); $oDom->loadHTML("èàéìòù"); echo $oDom->saveHTML(); 

Это результат:

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html><body><p>&Atilde;&uml;&Atilde;&nbsp;&Atilde;&copy;&Atilde;&not;&Atilde;&sup2;&Atilde;&sup1;</p></body></html> 

Я хочу этот вывод:

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html><body><p>èàéìòù</p></body></html> 

Я пробовал с …

 $oDom = new DomDocument('4.0', 'UTF-8'); 

или с 1.0 и другими вещами, но ничего.

Другое дело … Есть способ получить тот же нетронутый HTML? Например, с этим html во входе <p>hello!</p> получить тот же вывод <p>hello!</p> используя DOMDocument только для синтаксического анализа DOM и выполнения некоторых подстановок внутри тегов.

Решение:

 $oDom = new DOMDocument(); $oDom->encoding = 'utf-8'; $oDom->loadHTML( utf8_decode( $sString ) ); // important! $sHtml = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; $sHtml .= $oDom->saveHTML( $oDom->documentElement ); // important! 

Метод saveHTML() работает по-разному, указав узел. Вы можете использовать главный узел ( $oDom->documentElement ), добавляя нужный !DOCTYPE вручную. Еще одна важная вещь – utf8_decode() . Все атрибуты и другие методы класса DOMDocument , в моем случае, не дают желаемого результата.

Проблема, как представляется, известна, согласно комментариям пользователя на странице руководства на php.net . Предлагаемые решения включают

 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 

в документе перед тем, как вы поместите строки с символами, отличными от ASCII.

Еще один хак предлагает положить

 <?xml encoding="UTF-8"> 

как первый текст в документе, а затем удалить его в конце.

Неприятный материал. Пахнет мне как ошибка.

Попробуйте установить тип кодировки после загрузки HTML.

 $dom = new DOMDocument(); $dom->loadHTML($data); $dom->encoding = 'utf-8'; echo $dom->saveHTML(); 

Другой путь

Похоже, вам просто нужно установить substituteEntities, когда вы создаете объект DOMDocument.