当前位置:首页 > 技术 > 正文内容

详解 HTMLPurifier addElement 方法

代码老兵 技术 2026年3月5日 28

HTMLPurifier 中的 addElement 方法允许你 自定义 HTML 元素的定义,即指定某个元素可以包含哪些其他元素,定义元素的类型、属性等。这对于修改 HTMLPurifier 默认行为非常有用。

1. addElement 方法概述

addElement 方法允许你在 HTMLPurifier 配置中添加或修改特定元素的 标签定义。通过 addElement,你可以自定义 HTML 元素是否允许特定的子元素、哪些属性是合法的、该元素的类型等。

addElement 方法原型

$def->addElement(
   string $elementName,        // 要添加的元素名,例如 'p', 'div', 'video'
   string $type,               // 元素的类型(Block, Inline 等)
   string $contentModel,       // 元素的内容模型(控制该元素允许包含哪些子元素)
   string $contentModelType,   // 进一步定义该内容模型的具体限制
   string|null $allowedChildren // 允许嵌套的子元素(例如:'div', 'a', 'span' 等)
);

参数详解

  1. $elementName (string)

    • 这是你想要自定义的 HTML 元素的名称,例如 pdivvideoa 等。

    • 例如:

      $def->addElement('p', ...);

      会修改 <p> 标签的定义。

  2. $type (string)

    • Block

    • Inline

    • 这是元素的 类型,控制该元素是 块级元素Block)还是 行内元素Inline)。

    • Block: 块级元素,占据整个行,通常会有换行。例如:<div><p><section> 等。

    • Inline: 行内元素,不会破坏文档的流布局,通常在同一行内展示。例如:<a><span><b> 等。

    • 常见值:

    • 示例:

      $def->addElement('div', 'Block', ...);
      $def->addElement('span', 'Inline', ...);
  3. $contentModel (string)

    • Flow: 允许包含常见的 流式内容,例如 <div>, <section>, <p>, <video> 等。

    • Inline: 允许包含 行内内容,例如 <a>, <span>, <strong>, <em> 等。

    • #PCDATA: 纯文本内容。

    • Script: 允许 <script> 标签,表示这是一个脚本块。

    • 内容模型指定了该元素可以包含哪些其他元素。你可以指定该元素的 子元素类型(如:可以包含 InlineFlow 内容等)。

    • 常见值

    • 例如:

      // 允许 <div> 标签包含流式内容(Flow)
      $def->addElement('div', 'Block', 'Flow', ...);
      // 允许 <p> 标签包含文本(#PCDATA)和行内元素(Inline)
      $def->addElement('p', 'Block', '#PCDATA | Inline', ...);
  4. $contentModelType (string)

    • Flow: 该元素可以包含所有流内容,如块级和行内元素。

    • Inline: 该元素只可以包含行内元素。

    • 进一步 细化内容模型,决定该元素的内容模型 可以包含哪些具体类型的内容

    • 常见值:

    • 例如:

      // <div> 可以包含块级元素或行内元素(Flow)
      $def->addElement('div', 'Block', 'Flow', 'Flow', null);
  5. $allowedChildren (string|null)

    • 允许的子元素:这是一个可选参数,用来指定该元素内部允许的子元素。

    • 该参数使用管道符(|)分隔元素名称。

    • 如果设置为 null,则表示该元素可以包含任何子元素(即无限制)。

    • 例如:

      // 允许 <p> 标签内包含 <video> 和 <audio> 等元素
      $def->addElement('p', 'Block', 'Flow', 'Flow', 'video | audio');
    • 这意味着 <p> 标签可以包含 <video><audio> 标签。如果不设置 allowedChildren,则会按照内容模型的默认行为进行处理。

使用实例:

1. 允许 <p> 标签内包含 <video><audio> 元素

$def->addElement(
   'p',              // 元素名称
   'Block',          // 类型:块级元素
   'Flow',           // 内容模型:流式内容
   'Flow',           // 内容模型类型:流式内容(可以包含其他元素)
   'video | audio'   // 允许的子元素:video 和 audio
);

这个代码表示:

  • <p>块级元素

  • <p> 允许包含 流式内容,即其他块级和行内元素。

  • <p> 可以包含 <video><audio> 标签。

2. 允许 <div> 标签包含几乎所有类型的元素

$def->addElement(
   'div',            // 元素名称
   'Block',          // 类型:块级元素
   'Flow',           // 内容模型:流式内容
   'Flow',           // 内容模型类型:流式内容
   null              // 允许的子元素:没有限制,可以包含任何元素
);

这里我们将 <div> 定义为:

  • 允许任何类型的流式内容,可以嵌套其他任何 HTML 元素。

3. 自定义 <a> 标签的内容模型,使其可以嵌套任何标签

$def->addElement(
   'a',              // 元素名称
   'Inline',         // 类型:行内元素
   'Flow',           // 内容模型:流式内容
   'Flow',           // 内容模型类型:流式内容
   null              // 允许的子元素:没有限制
);

这里我们将 <a> 定义为:

  • 允许嵌套任何类型的流式内容,可以包含其他块级或行内元素。

流式内容请参考:https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Content_categories#flow_content

标签: HTMLPurifier

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。