我正在尝试获取 a 的内部 HTMLDOMElement
在 PHP 中。标记示例:
<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>"
All
字符已转换为 Unicode 不间断空格,这破坏了我的应用程序。
在我的理想世界中,有一种方法可以检索目标 div 内的原始 HTML 字符串as-is, 没有DomDocument
对它做任何事。这似乎不可能,所以下一个最好的办法是以某种方式关闭此字符转换。到目前为止我已经尝试过:
- Setting
$doc->substituteEntities = false;
没有结果。将其更改为true
也没有帮助。
- 切换
$doc->preserveWhiteSpace
无论如何都没有改变
- 改变
saveXML
to saveHTML
。没有什么区别。
最后我求助于这个 hack,它有效,但感觉不是正确的解决方案。
$markup = str_replace("\xc2\xa0", ' ', $markup);
当然有更好的方法吗?
您可以使用mb_convert_encoding() https://www.php.net/manual/en/function.mb-convert-encoding.php将 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;
Output:
<p>Here's some <em>funny</em> text</p>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)