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

详解 HTMLPurifier addElement 方法

代码老兵 技术 17

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...

发表评论

访客

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