详解 HTMLPurifier addElement 方法
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' 等)
);
参数详解
$elementName(string)这是你想要自定义的 HTML 元素的名称,例如
p、div、video、a等。例如:
$def->addElement('p', ...);会修改
<p>标签的定义。$type(string)BlockInline这是元素的 类型,控制该元素是 块级元素(
Block)还是 行内元素(Inline)。Block: 块级元素,占据整个行,通常会有换行。例如:<div>、<p>、<section>等。Inline: 行内元素,不会破坏文档的流布局,通常在同一行内展示。例如:<a>、<span>、<b>等。常见值:
示例:
$def->addElement('div', 'Block', ...);
$def->addElement('span', 'Inline', ...);$contentModel(string)Flow: 允许包含常见的 流式内容,例如<div>,<section>,<p>,<video>等。Inline: 允许包含 行内内容,例如<a>,<span>,<strong>,<em>等。#PCDATA: 纯文本内容。Script: 允许<script>标签,表示这是一个脚本块。内容模型指定了该元素可以包含哪些其他元素。你可以指定该元素的 子元素类型(如:可以包含
Inline或Flow内容等)。常见值:
例如:
// 允许 <div> 标签包含流式内容(Flow)
$def->addElement('div', 'Block', 'Flow', ...);// 允许 <p> 标签包含文本(#PCDATA)和行内元素(Inline)
$def->addElement('p', 'Block', '#PCDATA | Inline', ...);$contentModelType(string)Flow: 该元素可以包含所有流内容,如块级和行内元素。Inline: 该元素只可以包含行内元素。进一步 细化内容模型,决定该元素的内容模型 可以包含哪些具体类型的内容。
常见值:
例如:
// <div> 可以包含块级元素或行内元素(Flow)
$def->addElement('div', 'Block', 'Flow', 'Flow', null);$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