顾名思义,应该删除所有HTML标签。我们证明它的唯一方法是分析源代码。下一个分析适用于调用,没有白名单标签的第二个参数。strip_tags
strip_tags('...')
首先,关于HTML标签的一些理论:标签以一个开头,后跟非空格字符。如果此字符串以 开头,则不应对其进行解析。如果此字符串以 开头,则将其视为注释,并且不应解析以下文本。注释以 在此类注释中,字符 like 和 是允许的,以 终止。属性可以出现在标记中,其值可以选择用引号字符( 或 )括起来。如果存在这样的引号,则必须将其关闭,否则如果遇到 a,则不会关闭标记。<
?
!--
-->
<
>
'
"
>
该代码在 Firefox 中解释为:<a href="example>xxx</a><a href="second">text</a>
<a href="http://example.com%3Exxx%3C/a%3E%3Ca%20href=" second"="">text</a>
php 函数strip_tags
在 ext/standard/string.c 的第 4036 行中引用。该函数调用内部函数php_strip_tags_ex。
存在两个缓冲区,一个用于输出,另一个用于“内部 HTML 标记”。名为 的计数器保存左尖括号 () 的数目。
该变量包含引号字符 ( or ) (如果有),否则。最后一个字符存储在变量 中。depth
<
in_q
'
"
0
lc
这些函数具有五种状态,其中三种在函数上面的描述中提到。基于此信息和函数体,可以推导出以下状态:
- 状态 0 是输出状态(不在任何标记中)
- 状态 1 表示我们位于正常的 html 标记中(标记缓冲区包含
<
)
- 状态 2 表示我们在 php 标记内
- 状态 3:我们从输出状态出来,遇到了 和 字符 (标签缓冲区包含
<
!
<!
)
- 状态 4:在 HTML 注释内
我们只需要小心,不能插入任何标签。也就是说,后跟一个非空格字符。第 4326 行检查字符的大小写,如下所述:<
<
- 如果在引号内(例如),则忽略该字符(从输出中删除)。
<a href="inside quotes">
<
- 如果下一个字符是空格字符,
则<
将添加到输出缓冲区。
- 如果在 HTML 标记之外,则状态变为(“在 HTML 标记内”),并且最后一个字符设置为
1
lc
<
- 否则,如果在 HTML 标记内,则 named 的计数器将递增,并忽略该字符。
depth
如果在标记打开时满足 ,则变为(“不在引号中”)和变为(“不在标记中”)。标记缓冲区将被丢弃。>
state == 1
in_q
0
state
0
属性检查(对于像 和 这样的字符)在被丢弃的标记缓冲区上完成。所以结论是:'
"
strip_tags没有标签白名单可以安全地包含在标签之外,则不允许使用任何标签。
通过“外部标签”,我的意思是不像在标签中那样。文本可能包含 和,如 中所示。结果不是有效的 HTML,但 ,仍然需要转义,尤其是 .这可以用htmlspecialchars()来完成
。<a href="in tag">outside tag</a>
<
>
>< a>>
<
>
&
&
没有白名单参数的描述是:strip_tags
确保返回的字符串中不存在 HTML 标记。