我试图在 PHP 中获取 DOMElement
的内部 HTML。示例标记:
<div>...</div>
<div id="target"><p>Here's some <em>funny</em> text</p></div>
<div>...</div>
<div>...</div>
将上面的字符串输入变量$html
,我正在做:
$doc = new DOMDocument();
@$doc->loadHTML("<html><body>$html</body></html>");
$node = $doc->getElementById('target')
$markup = '';
foreach ($node->childNodes as $child) {
$markup .= $child->ownerDocument->saveXML($child);
}
生成的 $markup
字符串如下所示(转换为 JSON 以显示不可见字符):
"<p>Here's some \u00a0 <em>funny<\/em> \u00a0 text<\/p>"
所有
字符都已转换为 Unicode 不间断空格,这会破坏我的应用程序。
在我的理想世界中,有一种方法可以在目标 div 原样 中检索原始 HTML 字符串,而无需 DomDocument
对其进行任何操作.这似乎是不可能的,所以下一个最好的办法就是以某种方式关闭这个字符转换。到目前为止,我已经尝试过:
- 设置
$doc->substituteEntities = false;
没有结果。将其更改为true
也无济于事。 - 切换
$doc->preserveWhiteSpace
两种方式都没有改变 - 将
saveXML
更改为saveHTML
。没有区别。
最后我求助于这个 hack,它有效但感觉不是正确的解决方案。
$markup = str_replace("\xc2\xa0", ' ', $markup);
肯定有更好的方法吗?
最佳答案
您可以使用 mb_convert_encoding()
将 Unicode 字符转换为它们的实体而不触及您的括号等:
<?php
$html = '
<div>...</div>
<div id="target"><p>Here\'s some <em>funny</em> text</p></div>
<div>...</div>
<div>...</div>
';
$doc = new DOMDocument();
libxml_use_internal_errors();
$doc->loadHTML("<html><body>$html</body></html>");
$node = $doc->getElementById('target');
$markup = '';
foreach ($node->childNodes as $child) {
$markup .= $child->ownerDocument->saveHTML($child);
}
$markup = mb_convert_encoding($markup, 'HTML-ENTITIES', 'UTF-8');
echo $markup;
输出:
<p>Here's some <em>funny</em> text</p>
关于php - 如何防止 DOMDocument 转换为 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59147416/