在 PHP DOMDocument 中禁用 html 实体编码

发布于 2024-11-30 18:04:31 字数 365 浏览 1 评论 0原文

我不知道如何阻止 DOMDocument 破坏这些字符。

<?php

$doc = new DOMDocument();
$doc->substituteEntities = false;
$doc->loadHTML('<p>¯\(°_o)/¯</p>');
print_r($doc->saveHTML());

?>

预期输出: ˙(°_o)/˙

实际输出: (�°_o)/

http://codepad.org/W83eHSsT

I cannot figure out how to stop DOMDocument from mangling these characters.

<?php

$doc = new DOMDocument();
$doc->substituteEntities = false;
$doc->loadHTML('<p>¯\(°_o)/¯</p>');
print_r($doc->saveHTML());

?>

Expected Output:
¯(°_o)/¯

Actual Output:
¯(°_o)/¯

http://codepad.org/W83eHSsT

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

巾帼英雄 2024-12-07 18:04:31

我在 DOMDocument::loadHTML 文档:

(来自2009 年 12 月 21 日 05:02 的评论:“您还可以使用这个简单的 hack 将 HTML 加载为 UTF-8:”)

只需添加 ''

$doc = new DOMDocument();
//$doc->substituteEntities = false;
$doc->loadHTML('<?xml encoding="UTF-8">' . '<p>¯\(°_o)/¯</p>');
print_r($doc->saveHTML());

I've found a hint in the comments of DOMDocument::loadHTML documentation:

(Comment from <mdmitry at gmail dot com> 21-Dec-2009 05:02: "You can also load HTML as UTF-8 using this simple hack:")

Just add '<?xml encoding="UTF-8">' before the HTML-input:

$doc = new DOMDocument();
//$doc->substituteEntities = false;
$doc->loadHTML('<?xml encoding="UTF-8">' . '<p>¯\(°_o)/¯</p>');
print_r($doc->saveHTML());
安稳善良 2024-12-07 18:04:31
<?xml version="1.0" encoding="utf-8">

文档顶部负责 saveXML 和 saveHTML 的标签。

<?xml version="1.0" encoding="utf-8">

in the top of the document takes care of tags.. for both saveXML and saveHTML.

冷心人i 2024-12-07 18:04:31

如果 HTML 以 UTF-8 正确加载并且具有元 charset=utf-8 标记,PHP DOMDocument 不会将字符转换为 htmlentities。

想法是:

  • 正确检测 HTML 源编码并将其转换为 UTF-8
  • 使用 UTF-8 字符集加载 DOMDocument
  • 添加 meta charset=utf-8 标记到 DOMDocument
  • 执行任何操作
  • 保存结果后删除 meta charset=utf-8 标记。

这是一个示例代码:

<?php
$htmlContent = file_get_contents('source.html');
$convertedContent = mb_convert_encoding($htmlContent, 'UTF-8', mb_detect_encoding($htmlContent));

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($convertedContent);

// Create the meta tag element
$metaTag = $dom->createElement('meta');
$metaTag->setAttribute('http-equiv', 'Content-Type');
$metaTag->setAttribute('content', 'text/html; charset=utf-8');

// Append the meta charset tag to the head element
$head = $dom->getElementsByTagName('head')->item(0);
$head->appendChild($metaTag);

// Do any stuff here

// save the content without the meta charset tag
$new_content = str_replace('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">', '', $dom->saveHTML());

// save to a destination file
file_put_contents('dest.html', $new_content);

PHP DOMDocument will not convert characters to htmlentities if the HTML is properly loaded in UTF-8 and has the meta charset=utf-8 tag.

The idea is to:

  • Properly detect the HTML source encoding and convert it in UTF-8
  • Load the DOMDocument with the UTF-8 charset
  • Add the meta charset=utf-8 tag to the DOMDocument
  • Do any stuff
  • Remove the meta charset=utf-8 tag from after saving the result.

Here's a sample code:

<?php
$htmlContent = file_get_contents('source.html');
$convertedContent = mb_convert_encoding($htmlContent, 'UTF-8', mb_detect_encoding($htmlContent));

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML($convertedContent);

// Create the meta tag element
$metaTag = $dom->createElement('meta');
$metaTag->setAttribute('http-equiv', 'Content-Type');
$metaTag->setAttribute('content', 'text/html; charset=utf-8');

// Append the meta charset tag to the head element
$head = $dom->getElementsByTagName('head')->item(0);
$head->appendChild($metaTag);

// Do any stuff here

// save the content without the meta charset tag
$new_content = str_replace('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">', '', $dom->saveHTML());

// save to a destination file
file_put_contents('dest.html', $new_content);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文