これは私のコードです:
$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を取得する方法はありますか?たとえば、このhtmlを入力<p>hello!</p>
同じ出力を取得します<p>hello!</p>
DOMを解析し、タグ内でいくつかの置換を行うためにのみDOMDocumentを使用します。
解決:
_$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
_を手動で追加できます。もう1つの重要なことはutf8_decode()
です。私の場合、DOMDocument
クラスのすべての属性と他のメソッドは、望ましい結果を生成しません。
エンコーディングタイプを設定してみてくださいafter HTMLをロードしました。
$dom = new DOMDocument();
$dom->loadHTML($data);
$dom->encoding = 'utf-8';
echo $dom->saveHTML();
php.netのマニュアルページ に関するユーザーのコメントによると、この問題は既知のようです。そこで提案された解決策には、
<meta http-equiv="content-type" content="text/html; charset=utf-8">
非ASCII文字を含む文字列をに入れる前にドキュメントに。
別のハックは置くことを提案します
<?xml encoding="UTF-8">
ドキュメントの最初のテキストとして、最後に削除します。
厄介なもの。私には虫のようなにおいがします。
$dom = new DomDocument();
$str = htmlentities($str);
$dom->loadHTML(utf8_decode($str));
$dom->encoding = 'utf-8';
.
.
.
$str = $dom->saveHTML();
$str = html_entity_decode($str);
上記のコードは私のために働いた。
こちらです:
/**
* @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;
}
マークされた答えが私の問題に対して機能しなかった理由がわかりません。しかし、これはしました。
参照: 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
?>
私のために働いたのは:
$ doc-> loadHTML(mb_convert_encoding($ content、 'HTML-ENTITIES'、 'UTF-8'));
DOMDocumentオブジェクトを作成するときに、 substituteEntities を設定する必要があるようです。