如何使用 PHP DOMDocument::saveHTML() 阻止 html 实体?

2023-12-12

由于自定义存储需求(“为什么”在这里并不重要,谢谢!)我必须保存 html<a>特定格式的链接,例如:

myDOMNode->setAttribute("href", "{{{123456}}}");

一切正常,直到我打电话saveHTML()在包含的 DOMDocument 上。这会杀死它,因为它编码{ in %7B.

这是一个遗留应用程序,其中 href="{{{123456}}}" 作为占位符。命令行解析器会准确地查找此模式(未编码)并且无法更改。

我别无选择,只能这样做。

我无法 htmldecode() 结果。

这个 HTML 永远不会像这样显示,它只是一个存储需求。

感谢您的帮助!

注意:我已经环顾了 2 个小时,但所提出的解决方案都不适合我。对于那些盲目地将问题标记为重复的人:请发表评论并让我知道。


由于遗留代码正在使用{{{...}}}作为占位符,使用有点黑客的方法可能是安全的预替换回调。生成 HTML 后,以下内容将恢复 URL 编码的占位符:

$src = <<<EOS
<html>
    <body>
        <a href="foo">Bar</a>
   </body>
</html>
EOS;

// Create DOM document
$dom = new DOMDocument();
$dom->loadHTML($src);

// Alter `href` attribute of anchor
$a = $dom->getElementsByTagName('a')
    ->item(0)
    ->setAttribute('href', '{{{123456}}}');

// Callback function to URL decode match
$urldecode = function ($matches) {
    return urldecode($matches[0]);
};

// Turn DOMDocument into HTML string, then restore/urldecode placeholders 
$html = preg_replace_callback(
    '/' . urlencode('{{{') . '\d+' . urlencode('}}}') . '/',
    $urldecode,
    $dom->saveHTML()
);

echo $html, PHP_EOL;

输出(为了清晰起见缩进):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
    <body>
        <a href="{{{123456}}}">Bar</a>
    </body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PHP DOMDocument::saveHTML() 阻止 html 实体? 的相关文章

随机推荐

  • iPad 版 Three20

    我需要在我的 iPad 项目中使用 Three20 我想知道 iPhone 版本的 Three20 项目是否可以直接在 iPad 上使用 还是应该等待这个时间表完成 http two20 info timeline roadmap OS 3
  • Apache Camel - IBM MQ 集成

    我有一个 Apache Camel 版本 2 18 项目 它通过 IBM MQ 客户端将文件发送到我合作伙伴的 IBM MQ 服务器 然而 我的伙伴使用messageId作为文件名 因此 我们必须将特定的文件名设置为messageId 我的
  • 我收到 'int' 对象不可下标

    我是 python 新手 我首先尝试为我的项目实现代码 我的错误代码是 int 类型的对象没有 len 这是我的代码并添加了 str 来解决问题 xored value ord Mblocks i len Mblocks ord Cbloc
  • 使用 ORMLite 准备查询的 SQL 异常

    我正在使用 ORM ORMlite 并且所有调用都进展顺利 直到出现以下错误 线程 main 中的异常org h2 jdbc JdbcSQLException SQL语句中的语法错误 SELECT FROM STORIES WHERE TI
  • 如果使用 docker 部署,为什么 MERN 应用程序无法与后端通信?

    我使用 Docker 将 MERN 应用程序部署到数字海洋 Droplet 如果我运行我的docker compose yml文件本地在我的电脑上运行良好 我有 2 个容器 1 个后端 1 个前端 如果我尝试在 Droplet 上进行组合
  • JSONDecodeError:额外数据:第 1 行第 228 列(字符 227)

    我正在使用 Ipython 进行一些数据分析 我无法加载 JSON 文件 请帮我在 IPython 中加载这个 JSON 文件 我还想跳过第一行中的相同单词以使其成为干净的格式 我希望每条记录如下所示 station id 72 num b
  • 字符串到字典字数统计

    所以我在家庭作业问题上遇到了麻烦 编写一个函数 word counter input str 它接受字符串 input str 并返回一个字典 将 input str 中的单词映射到其出现次数 所以到目前为止我的代码是 def word c
  • 如何在 Rails 中的 Chartkicks 中显示数据计数以及百分比

    Using chartkicks用于显示图表 它仅显示百分比 我想显示数量 金额以及百分比 Chartkickgem 是上面的包装Google Charts 通过使用库选项 您可以指定在legend并设置其他配置选项 所以像这样 有关更多配
  • 尝试更改 Google 云端硬盘中文件的所有者

    我尝试更改云端硬盘中文档的所有权 但收到以下错误 很抱歉 服务器发生错误 请稍等一下 然后重试 第 12 行 文件 代码 function transferFiles var files DriveApp getFiles while fi
  • JNA 与 Fortran 假定大小的数组

    我有一个 Fortran 子例程 采用假定大小的数组 subroutine sub arr implicit none double precision arr end subroutine 我使用 JNA 从 Java 进行了本机调用 F
  • Delphi:发生意外的内存泄漏

    在 Delphi 中 我已配置为报告内存泄漏 IFDEF Debug ReportMemoryLeaksOnShutdown true ENDIF After exiting the program I get the following
  • 在bash shell脚本中初始化动态变量(可变变量)

    我通过 bash shell 使用 PHP CLI 请检查在 shell 脚本中操作数组 由 php cli 打印 了解详情 在下面的 shell 代码中我能够回显key value我从 PHP 脚本中获得的对 IFS parse php
  • wp7水平滑动选择

    我正在寻找一个允许我滑动项目列表的控件 水平滑动将在下一个和上一个项目之间移动 该控件还将确保所选项目在不被操作时移动到中心 该控件仅占据页面的一半 我希望左侧和右侧的选项可见并环绕 Like so lt gt 所以我的问题是 这样的控件是
  • Google Play - 零支持的设备

    我知道这里有类似的问题 但似乎没有一个令人满意的答案 我正在尝试发布应用程序 但无论我尝试什么 开发人员控制台都会报告支持的设备数为零 这是我的完整清单
  • 如何获取R脚本出错时的行号?

    如果我从命令行运行一个很长的 R 脚本 R slave script R 那么我怎样才能让它在错误时给出行号呢 如果可能的话 我不想将调试命令添加到脚本中 我只是希望 R 表现得像大多数其他脚本语言一样 这不会给您行号 但它会告诉您调用堆栈
  • WPF 与 Windows 窗体

    我对 WPF 和 Windows 窗体非常困惑 WPF 相对于 Windows 窗体的用途是什么 WPF有什么用 WPF 是一个用于开发 Windows 和浏览器 应用程序的新平台 WPF不一定有replaceWindows 窗体 使用 W
  • Dojo 中的 DataGrid,包含来自 servlet 的 json 数据

    我第一次使用 JSON 并想用我的 JSON 数据填充我的数据网格 这是我的 JSON 数据 head vars s fname lname results bindings s type uri value http tn gov in
  • 按键对散列进行分组并对值求和

    我有一个哈希数组 Vegetable gt 10 Vegetable gt 5 Dry Goods gt 3 gt Dry Goods gt 2 我需要使用inject我想 但我真的一直在挣扎 我想要一个新的哈希值来反映前一个哈希值的重复键
  • 如何使用 PHP 解码以“\u”开头的内容

    如何使用 PHP 解码以 u 开头的内容 e g u4f60 u5df2 u7ecf u6dfb u52a0 u4e86 u6b64 u8bdd u9898 谢谢 对于 PHP 5 4 intl s u4f60 u5df2 u7ecf u6
  • 如何使用 PHP DOMDocument::saveHTML() 阻止 html 实体?

    由于自定义存储需求 为什么 在这里并不重要 谢谢 我必须保存 html a 特定格式的链接 例如 myDOMNode gt setAttribute href 123456 一切正常 直到我打电话saveHTML 在包含的 DOMDocum