这是我的代码:
$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>èà éìòù</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吗?
例如,输入<p>hello!</p>
中的这个html使用DOMDocument获取相同的输出<p>hello!</p>
仅用于解析DOM并在标记内进行一些替换。
答案 0 :(得分:41)
解决方案:
$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
类的所有属性和其他方法都不会产生所需的结果。
答案 1 :(得分:6)
尝试在加载HTML后设置编码类型。
$dom = new DOMDocument();
$dom->loadHTML($data);
$dom->encoding = 'utf-8';
echo $dom->saveHTML();
答案 2 :(得分:5)
根据用户对manual page at php.net的评论,该问题似乎已为人所知。解决方案建议包括推送
<meta http-equiv="content-type" content="text/html; charset=utf-8">
在将任何带有非ASCII字符的字符串放入文档之前的文档中。
另一个黑客建议把
<?xml encoding="UTF-8">
作为文档中的第一个文本,然后在最后删除它。
讨厌的东西。闻起来像个臭虫。答案 3 :(得分:5)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new IgnoreAntiforgeryTokenAttribute());
});
}
}
上面的代码对我有用。
答案 4 :(得分:1)
我不知道为什么标记的答案不能解决我的问题。但是这个确实做到了。
ref:https://www.php.net/manual/en/class.domdocument.php
<?php
// checks if the content we're receiving isn't empty, to avoid the warning
if ( empty( $content ) ) {
return false;
}
// converts all special characters to utf-8
$content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');
// creating new document
$doc = new DOMDocument('1.0', 'utf-8');
//turning off some errors
libxml_use_internal_errors(true);
// it loads the content without adding enclosing html/body tags and also the doctype declaration
$doc->LoadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
// do whatever you want to do with this code now
?>
答案 5 :(得分:0)
看起来您只需在创建DOMDocument对象时设置substituteEntities。
答案 6 :(得分:0)
这种方式:
/**
* @param string $text
* @return DOMDocument
*/
private function buildDocument($text)
{
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . $text);
libxml_use_internal_errors(false);
return $dom;
}
答案 7 :(得分:0)
对我有用的是:
$ doc-> loadHTML(mb_convert_encoding($ content,'HTML-ENTITIES','UTF-8'));
答案 8 :(得分:0)
以上都不适合我,但这个可以:
$fileContent = file_get_contents('my_file.html');
$dom = new DOMDocument();
@$dom->loadHTML(mb_convert_encoding($fileContent, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$dom->encoding = 'utf-8';
$html = $dom->saveHTML();
$html = html_entity_decode($html, ENT_COMPAT, 'UTF-8');
echo $html;