2

我正在使用以下函数来获取 html 字符串的内部 html

function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
        $tmp_dom = new DOMDocument('1.0', 'UTF-8');
        $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
        $innerHTML .= trim($tmp_dom->saveHTML()); 
    }

    return $innerHTML; 
} 

我的 html 字符串还包含 unicode 字符。这是html字符串的示例

$html = '<div>Thats True. Yes it is well defined آپ مجھے تم کہہ کر پکاریں</div>';

当我使用上述功能时

$output = DOMinnerHTML($html);

输出如下

$output = '<div>Thats True. Yes it is well defined 
&#1705;&#1746;&#1748;&#1587;&#1604;&#1591;&#1575</div>';

转换为数值的实际 unicode 字符。

我已经调试了代码,发现在下面一行之前的 DOMinnerHTML 函数中

$innerHTML .= trim($tmp_dom->saveHTML()); 

如果我回声

echo $tmp_dom->textContent;

它显示实际的 unicode 字符,但在保存后$innerHTML输出数字符号。为什么这样做。

注意:请不要建议我使用 html_entity_decode 之类的函数将数字符号转换为真正的 unicode 字符,因为我的 html 字符串中还有用户格式化的数据,我不想转换。

注意:我也试过把

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

在我的 html 字符串之前,但没有区别。

4

3 回答 3

1

我有一个类似的问题。在阅读了上述评论后,经过进一步调查,我找到了一个非常简单的解决方案。

你所要做的就是用html_entity_decode()来转换 的输出saveHTML(),如下:

// Create a new dom document
$dom = new DOMDocument();


// .... Do some stuff, adding nodes, ...etc.


// the html_entity_decode function will solve the unicode issue you described
$result = html_entity_decode($dom->saveHTML();

// echo your output
echo $result;

这将确保正确显示 unicode 字符

于 2013-07-13T05:18:33.050 回答
0

好问题,你做得很好,将问题缩小到导致事情变得混乱的一行代码!这让我弄清楚出了什么问题。

问题在于DOMDocument 的 saveHTML() 函数。它正在做它应该做的事情,但它的设计不是你想要的。

saveHTML() 将文档转换为“使用 HTML 格式”的字符串 - 这意味着它会为您进行 HTML 实体编码!可悲的是,这不是你想要的。PHP 文档中的注释还表明 DOMDocument 不能很好地处理 utf-8 并且不能很好地处理片段(因为它会自动添加 html、doctype 等)。

只需使用另一个类即可查看此评论以获取建议的解决方案:DOMDocument 的替代方案

在看到许多关于某些 DOMDocument 缺点的投诉后,例如编码处理不当以及总是使用 、 和 DOCTYPE 保存 HTML 片段,我决定需要一个更好的解决方案。

所以这里是:SmartDOMDocument。您可以在 http://beerpla.net/projects/smartdomdocument/找到它

目前,主要亮点是:

  • SmartDOMDocument 继承自 DOMDocument,因此非常易于使用 - 只需声明 SmartDOMDocument 类型的对象而不是 DOMDocument 并享受所有现有功能之上的新行为(参见下面的示例)。

  • saveHTMLExact() - DOMDocument 有一个设计非常糟糕的“功能”,如果您正在加载的 HTML 代码不包含和标签,它会自动添加它们(是的,没有标志可以关闭此行为)。因此,当您调用 $doc->saveHTML() 时,您新保存的内容中现在包含和 DOCTYPE。尝试使用代码片段时不是很方便(XML 有类似的问题)。SmartDOMDocument 包含一个名为 saveHTMLExact() 的新函数,它完全符合您的要求 - 它保存 HTML 而不添加 DOMDocument 所做的额外垃圾。

  • 编码修复 - 众所周知,DOMDocument 不能正确处理编码(至少是 UTF-8),并且输出会出现乱码。SmartDOMDocument 尝试通过增强 loadHTML() 以正确处理编码来解决此问题。这种行为对您来说是透明的——只需像往常一样使用 loadHTML() 即可。

于 2013-04-05T17:08:54.160 回答
0

mb_convert_encoding($html,'HTML-ENTITIES','UTF-8');

这对我有用

于 2015-08-23T06:57:30.443 回答