我使用以下函数来获取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
کے۔سلطا</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字符串之前但没有区别。
答案 0 :(得分:0)
很好的问题,你做了一个很好的工作,将问题缩小到一行代码,导致事情变得混乱!这让我可以弄清楚出了什么问题。
问题在于DOMDocument's saveHTML() function。它正在做它应该做的事情,但它的设计并不是你想要的。
saveHTML()将文档转换为“使用HTML格式”的字符串 - 这意味着它为您执行HTML实体编码!可悲的是,这不是你想要的。 PHP文档中的注释也表明DOMDocument不能很好地处理utf-8,并且不能很好地处理片段(因为它会自动添加html,doctype等)。
只需使用另一个类alternative to DOMDocument
,查看此评论即可获得建议的解决方案看到很多关于某些DOMDocument缺点的投诉后, 例如编码处理不当并始终保存HTML片段 有了,和DOCTYPE,我认为更好的解决方案是 需要的。
所以这里是:SmartDOMDocument。你可以找到它 http://beerpla.net/projects/smartdomdocument/
目前,主要亮点是:
SmartDOMDocument继承自DOMDocument,因此它非常易于使用 - 只需声明一个SmartDOMDocument类型的对象而不是DOMDocument,并享受所有现有的新行为 功能(见下面的例子)。
saveHTMLExact() - DOMDocument有一个设计极其糟糕的“功能”,如果您加载的HTML代码不包含 和标签,它自动添加它们(是的,没有 用于关闭此行为的标志)。因此,当你打电话 $ doc-&gt; saveHTML(),您新保存的内容现在有和 其中有DOCTYPE。尝试使用代码片段时不是很方便 (XML也有类似的问题)。 SmartDOMDocument包含一个新功能 称为saveHTMLExact(),它完全符合您的要求 - 它 保存HTML而不添加DOMDocument所做的额外垃圾。
编码修复 - 众所周知,DOMDocument不能正确处理编码(至少是UTF-8)并使输出变得混乱。 SmartDOMDocument尝试 通过增强loadHTML()来解决这个问题 编码正确。这种行为对你来说是透明的 - 只需使用 像往常一样加载HTML()。
答案 1 :(得分:0)
我有类似的问题。在阅读了上述评论后,经过进一步调查,我找到了一个非常简单的解决方案。
您只需使用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字符
答案 2 :(得分:0)
mb_convert_encoding($ HTML,&#39; HTML实体&#39;,&#39; UTF-8&#39);
这对我有用