亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么這兩個 DOMDocument 函數的行為不同?

為什么這兩個 DOMDocument 函數的行為不同?

PHP
MMTTMM 2022-08-19 16:05:39
這里建議有兩種方法可以獲取 DOMDocument 節點的外部 HTML:如何返回 DOMDocument 的外部 html?我感興趣的是為什么他們似乎以不同的方式對待HTML實體。例:function outerHTML($node) {    $doc = new DOMDocument();    $doc->appendChild($doc->importNode($node, true));    return $doc->saveHTML();}$html = '<p>ACME&rsquo;s 27&rdquo; Monitor is $200.</p>';$dom = new DOMDocument();@$dom->loadHTML($html);$el = $dom->getElementsByTagname('p')->item(0);echo $el->ownerDocument->saveHtml($el) . PHP_EOL;echo outerHTML($el) . PHP_EOL;輸出:<p>ACME’s 27” Monitor is $200.</p><p>ACME&rsquo;s 27&rdquo; Monitor is $200.</p>這兩種方法都使用 saveHTML(),但由于某種原因,該函數在最終輸出中保留了 html 實體,而直接使用節點上下文調用則不會。誰能解釋一下為什么 - 最好有某種權威的參考?saveHTML()
查看完整描述

1 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

歸根結底,這比上面的測試用例還要簡單:


<?php

$html = '<p>ACME&rsquo;s 27&rdquo; Monitor is $200.</p>';

$dom = new DOMDocument();

@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);


echo $dom->saveHtml($dom->documentElement) . PHP_EOL;

echo $dom->saveHtml() . PHP_EOL;

那么問題來了,為什么在保存整個文檔而不僅僅是一個特定的節點時,行為會有所不同?DomDocument::saveHtml

通過查看PHP源代碼,我們會發現它是使用單個節點還是整個文檔進行檢查。對于前者,調用該函數時,編碼顯式設置為 null。對于后者,使用函數,編碼不作為此函數的參數包含在內。htmlNodeDumpFormatOutputhtmlDocDumpMemoryFormat

這兩個函數都來自 libxml2 庫。查看源,我們可以看到嘗試檢測文檔編碼,并在找不到文檔編碼時將其顯式設置為ASCII / HTML。htmlDocDumpMemoryFormat

這兩個函數最終都調用htmlNodeListDumpOutput,并為其傳遞已確定的編碼;null ( 不會導致編碼 – 或 ASCII/HTML – 使用 HTML 實體進行編碼。

我的猜測是,對于文檔片段或單個節點,編碼被認為不如完整文檔重要。


查看完整回答
反對 回復 2022-08-19
  • 1 回答
  • 0 關注
  • 148 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號