php - 如何防止 DOMDocument 转换为 unicode

标签 php domdocument

我试图在 PHP 中获取 DOMElement 的内部 HTML。示例标记:

<div>...</div>
<div id="target"><p>Here's some &nbsp; <em>funny</em> &nbsp; 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", '&nbsp;', $markup);

肯定有更好的方法吗?

最佳答案

您可以使用 mb_convert_encoding()将 Unicode 字符转换为它们的实体而不触及您的括号等:

<?php
$html = '
<div>...</div>
<div id="target"><p>Here\'s some &nbsp; <em>funny</em> &nbsp; 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 &nbsp; <em>funny</em> &nbsp; text</p>

关于php - 如何防止 DOMDocument 转换为 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59147416/

相关文章:

php - 在WooCommerce的“Quick View”窗口中显示自定义选择表单

php - 我正在尝试在页面上抓取带有 id 的特定 div

php - 如何解析和抓取WordPress的内容

php - Xpath反向搜索

php - 比较从 mySql 查询返回的字符串

php - 单击按钮时如何使用 $_Post 方法将多个变量从一个 php 文件传递​​到另一个文件?

php - 当查询本身有效时,为什么 php 脚本中的此查询不起作用?

php - openssl_pkcs12_export() 和 openssl_x509_export() PHP 函数有什么区别?

php - 如何使用xpath和domdocument截断<div>中的一部分html并将其存储为html字符串?

PHP DOMDocument : insertBefore, 如何让它工作?