PHP DOMDocument saveHTML Добавляет Charachter [дубликат]

Фоновая работа cron звучит как хорошая идея для этого.

Вам понадобится ssh доступ к машине для запуска скрипта как cron.

$ php scriptname.php , чтобы запустить его.

140
задан cmbuckley 17 October 2013 в 23:31
поделиться

10 ответов

Вы должны передать DOMDocument версию своего HTML с заголовком, который имеет смысл. Также как HTML5.

$profile ='<?xml version="1.0" encoding="'.$_encoding.'"?>'. $html;

может быть хорошей идеей, чтобы ваш html был как можно более эффективным, так что вы не попадаете в проблемы, когда вы начнете запрос ... вокруг :-) и избегайте htmlentities !!!! Это необходимый ресурс назад и вперед. держите свой код безумным !!!!

345
ответ дан cmbuckley 16 August 2018 в 01:28
поделиться
  • 1
    Для меня работал вызов mb_convert_encoding, в то время как добавление объявления кодирования не выполнялось. Вероятно, потому что документ уже имел противоречивую декларацию. Огромное спасибо - мне пришлось много времени гоняться за этим. – Peter Bagnall 4 July 2013 в 13:43
  • 2
    mb_convert_encoding отлично работает, спасибо. – GG. 27 January 2015 в 14:57
  • 3
    Еще в 2017 году этот ответ уместен и работал для меня тоже. У меня была база данных, multibyte, html meta tag и DOM, кодирующая все, установленные в utf8, и все еще имела плохую кодировку при импорте узла из одной DOC в другую. php.net/manual/en/function.mb-convert-encoding.php было исправлением. – Louis Loudog Trottier 6 March 2017 в 22:43
  • 4
    $dom->loadHTML('<?xml encoding="utf-8" ?>' . $content); сделал это для меня! – Brainfeeder 25 January 2018 в 00:53
  • 5
    $dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8')); отлично работает! Спасибо, – vee 8 March 2018 в 07:05
354
ответ дан cmbuckley 6 September 2018 в 00:46
поделиться

Используйте его для правильного результата

$dom = new DOMDocument();
$dom->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . $profile);
echo $dom->saveHTML();
echo $profile;

Эта операция

mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8');

Это плохо, потому что специальные символы, такие как & amp; lt; , & delta; может быть в $ profile, и они не будут конвертировать два раза после mb_convert_encoding. Это отверстие для XSS и неправильный HTML.

0
ответ дан Alexander Goncharov 16 August 2018 в 01:28
поделиться

Проблема заключается в том, что при добавлении параметра в функцию DOMDocument :: saveHTML () вы теряете кодировку. В некоторых случаях вам нужно избегать использования параметра и использовать функцию старой строки, чтобы найти то, что вы ищете.

Я думаю, что предыдущий ответ работает на вас, но поскольку это обходное решение Я работаю для меня, я добавляю этот ответ, чтобы помочь ppl, который может быть в моем случае.

0
ответ дан copndz 16 August 2018 в 01:28
поделиться

Проблема заключается в saveHTML() и saveXML(), оба из них не работают корректно в Unix. Они не сохраняют символы UTF-8 правильно при использовании в Unix, но они работают в Windows.

Обходной путь очень прост:

Если вы попробуете значение по умолчанию, вы получите описанная вами ошибка

$str = $dom->saveHTML(); // saves incorrectly

Все, что вам нужно сделать, это сохранить следующим образом:

$str = $dom->saveHTML($dom->documentElement); // saves correctly

Эта строка кода позволит правильно сохранить ваши символы UTF-8 (используйте тот же обходной путь, если вы используете saveXML()).


Примечание

  1. Английские символы не вызывают никаких проблем, если вы используете saveHTML() без параметров (потому что Английские символы сохраняются как одиночные байтовые символы в UTF-8)
  2. Проблема возникает, когда у вас многобайтовые символы (например, китайский, русский, арабский, иврит и т. Д.).

Я рекомендую прочитать эту статью: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Вы поймете, как работает UTF-8 и почему у вас есть эта проблема. Это займет у вас около 30 минут, но это время хорошо проведено.

39
ответ дан Greeso 16 August 2018 в 01:28
поделиться
  • 1
    Я использовал utf8_decode при использовании этого решения. Благодаря! – Jack M. 9 September 2014 в 00:48
  • 2
    Это должно было стать utf8_decode ($ dom- & gt; saveHTML (dom- & gt; documentElement)), чтобы сохранить мои специальные символы. В противном случае они просто стали чем-то другим. Просто упомянуть об этом, если это поможет кому-то другому. – Jack M. 10 September 2014 в 14:52
  • 3
    Спасибо @MrJack. Я также должен был сделать то же самое, чтобы он отображался без странных символов $str = utf8_decode($dom->saveHTML($dom->documentElement)); – Pamela 15 January 2016 в 12:34
  • 4
    utf8_decode($dom->saveHTML($dom->documentElement)); сделал это отлично для меня. – Marco Aurélio Deleu 20 October 2016 в 22:48
  • 5
    Вы спасли мою жизнь этим. Я искал этот ответ ВЕЗДЕ! Спасибо! – Paulo Hgo 28 March 2017 в 17:26

Убедитесь, что реальный исходный файл сохранен как UTF-8 (вы даже можете попробовать не рекомендуемые символы спецификации с UTF-8, чтобы убедиться).

Также в случае HTML, убедитесь, что вы указали правильную кодировку с помощью тегов meta:

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

Если это CMS (как вы отметили свой вопрос с помощью Joomla), вам может потребоваться настроить соответствующие настройки для кодировки.

14
ответ дан Hossein 16 August 2018 в 01:28
поделиться
  • 1
    Я понимаю, что вы говорите, но у меня нет проблем с отображением персонажей. если я делаю & quot; echo $ profile; & quot; он отлично работает. это когда DomDocument получает это, что он начинает терпеть неудачу. – Slightly A. 21 November 2011 в 23:08
  • 2
    Ваша мета предотвращает saveHTML от кодирования всего выше ASCII в сущности. Решение, которое я искал :) – sod 28 June 2013 в 14:32
  • 3
    В качестве дополнительной заметки новый тег <meta charset="UTF-8"> не работает с DOMDocument. – Taylan 16 October 2015 в 15:23

Работает для меня:

$dom = new \DOMDocument;
$dom->loadHTML(utf8_decode($html));
...
return  utf8_encode( $dom->saveHTML());
2
ответ дан mMo 16 August 2018 в 01:28
поделиться
  • 1
    Спасибо, это сработало и для меня. – Roel Magdaleno 10 February 2017 в 01:02
  • 2
    Будьте осторожны, utf8_decode может потерять информацию (заменен на ?) – jwal 14 September 2017 в 16:42

Мне потребовалось некоторое время, чтобы понять, но вот мой ответ.

Прежде чем использовать DomDocument, я бы использовал file_get_contents для извлечения URL-адресов, а затем обработал их строковыми функциями. Возможно, это не лучший способ, но быстрый. Убедившись, что Dom был так же быстрым, я сначала попробовал следующее:

$dom = new DomDocument('1.0', 'UTF-8');
if ($dom->loadHTMLFile($url) == false) { // read the url
    // error message
}
else {
    // process
}

Это не удалось эффектно в сохранении кодировки UTF-8, несмотря на правильные метатеги, настройки php и все остальные предлагаемые здесь средства защиты и в других местах. Вот что работает:

$dom = new DomDocument('1.0', 'UTF-8');
$str = file_get_contents($url);
if ($dom->loadHTML(mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8')) == false) {
}

и т. Д. Теперь все в порядке с миром. Надеюсь, это поможет.

4
ответ дан Sam 16 August 2018 в 01:28
поделиться
  • 1
    Просто хотел добавить к моему ответу выше, что еще один способ решения этого вопроса - это следующее, предложенное в другом месте: if ($ dom- & gt; loadHTML ('& lt;? Xml encoding = "UTF-8" gt; "). $ str) == false). После публикации моего ответа я нашел случай, когда мое первое предложение провалилось, но второе сработало. – Sam 20 November 2017 в 17:14

Вы можете префикс строки, применяющей кодировку utf-8, например:

@$doc->loadHTML('<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $profile);

И вы можете продолжить с кодом, который у вас уже есть, например:

$doc->saveXML()
8
ответ дан trincot 16 August 2018 в 01:28
поделиться

Попробуйте использовать utf8_encode

-3
ответ дан Webnet 16 August 2018 в 01:28
поделиться
  • 1
    Пробовал без успеха. Вернули те же символы, что и раньше. – Slightly A. 21 November 2011 в 23:22
Другие вопросы по тегам:

Похожие вопросы: