Фоновая работа cron звучит как хорошая идея для этого.
Вам понадобится ssh доступ к машине для запуска скрипта как cron.
$ php scriptname.php
, чтобы запустить его.
Вы должны передать DOMDocument версию своего HTML с заголовком, который имеет смысл. Также как HTML5.
$profile ='<?xml version="1.0" encoding="'.$_encoding.'"?>'. $html;
может быть хорошей идеей, чтобы ваш html был как можно более эффективным, так что вы не попадаете в проблемы, когда вы начнете запрос ... вокруг :-) и избегайте htmlentities
!!!! Это необходимый ресурс назад и вперед. держите свой код безумным !!!!
Используйте его для правильного результата
$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.
Проблема заключается в том, что при добавлении параметра в функцию DOMDocument :: saveHTML () вы теряете кодировку. В некоторых случаях вам нужно избегать использования параметра и использовать функцию старой строки, чтобы найти то, что вы ищете.
Я думаю, что предыдущий ответ работает на вас, но поскольку это обходное решение Я работаю для меня, я добавляю этот ответ, чтобы помочь ppl, который может быть в моем случае.
Проблема заключается в saveHTML()
и saveXML()
, оба из них не работают корректно в Unix. Они не сохраняют символы UTF-8 правильно при использовании в Unix, но они работают в Windows.
Обходной путь очень прост:
Если вы попробуете значение по умолчанию, вы получите описанная вами ошибка
$str = $dom->saveHTML(); // saves incorrectly
Все, что вам нужно сделать, это сохранить следующим образом:
$str = $dom->saveHTML($dom->documentElement); // saves correctly
Эта строка кода позволит правильно сохранить ваши символы UTF-8 (используйте тот же обходной путь, если вы используете saveXML()
).
saveHTML()
без параметров (потому что Английские символы сохраняются как одиночные байтовые символы в UTF-8) Я рекомендую прочитать эту статью: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Вы поймете, как работает UTF-8 и почему у вас есть эта проблема. Это займет у вас около 30 минут, но это время хорошо проведено.
$str = utf8_decode($dom->saveHTML($dom->documentElement));
– Pamela
15 January 2016 в 12:34
utf8_decode($dom->saveHTML($dom->documentElement));
сделал это отлично для меня.
– Marco Aurélio Deleu
20 October 2016 в 22:48
Убедитесь, что реальный исходный файл сохранен как UTF-8 (вы даже можете попробовать не рекомендуемые символы спецификации с UTF-8, чтобы убедиться).
Также в случае HTML, убедитесь, что вы указали правильную кодировку с помощью тегов meta
:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Если это CMS (как вы отметили свой вопрос с помощью Joomla), вам может потребоваться настроить соответствующие настройки для кодировки.
<meta charset="UTF-8">
не работает с DOMDocument.
– Taylan
16 October 2015 в 15:23
Работает для меня:
$dom = new \DOMDocument;
$dom->loadHTML(utf8_decode($html));
...
return utf8_encode( $dom->saveHTML());
?
)
– 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) {
}
и т. Д. Теперь все в порядке с миром. Надеюсь, это поможет.
Вы можете префикс строки, применяющей кодировку utf-8
, например:
@$doc->loadHTML('<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $profile);
И вы можете продолжить с кодом, который у вас уже есть, например:
$doc->saveXML()
mb_convert_encoding
отлично работает, спасибо. – GG. 27 January 2015 в 14:57$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
сделал это для меня! – Brainfeeder 25 January 2018 в 00:53$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
отлично работает! Спасибо, – vee 8 March 2018 в 07:05