web-dev-qa-db-ja.com

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> DOMを解析し、タグ内でいくつかの置換を行うためにのみDOMDocumentを使用します。

23

解決:

_$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クラスのすべての属性と他のメソッドは、望ましい結果を生成しません。

46

エンコーディングタイプを設定してみてくださいafter HTMLをロードしました。

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

他の方法

6
SAIF

php.netのマニュアルページ に関するユーザーのコメントによると、この問題は既知のようです。そこで提案された解決策には、

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

非ASCII文字を含む文字列をに入れる前にドキュメントに。

別のハックは置くことを提案します

<?xml encoding="UTF-8">

ドキュメントの最初のテキストとして、最後に削除します。

厄介なもの。私には虫のようなにおいがします。

5
user213154
$dom = new DomDocument();
$str = htmlentities($str);
$dom->loadHTML(utf8_decode($str));
$dom->encoding = 'utf-8';
.
.
.
$str = $dom->saveHTML();
$str = html_entity_decode($str);

上記のコードは私のために働いた。

4
int_ashish

こちらです:

/**
 * @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;
}
3

マークされた答えが私の問題に対して機能しなかった理由がわかりません。しかし、これはしました。

参照: 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

?>
2
Nurkartiko

私のために働いたのは:

$ doc-> loadHTML(mb_convert_encoding($ content、 'HTML-ENTITIES'、 'UTF-8'));

クレジット: https://davidwalsh.name/domdocument-utf8-problem

0
Pratip Ghosh

DOMDocumentオブジェクトを作成するときに、 substituteEntities を設定する必要があるようです。

0
Quentin