首页 > 解决方案 > 删除所有内联 html 属性,但保留一些

问题描述

我正在尝试使用 preg_replace 编写一个 php 函数,该函数删除 html 元素的所有内联属性,但想留下一些像'href','title','alt'。

到现在为止我得到的是

([\w\-.:]+)\s*=\s*("[^"]*"|'[^']*'|[\w\-.:]+)

用于标记所有内联元素,但它仍然需要像这样的文本

href="test" Test

此外,它周围没有任何 html,这需要所有内联属性。在此处查看我的示例文本:

[ https://regex101.com/r/3OVaO2/1][1]

目标是删除任何危险的 html 元素。我知道我必须在一个额外的函数中为 href 属性处理一些东西。

标签: htmlregex

解决方案


正如评论中已经提到的,正则表达式不是这里的方法。

也就是说:我想出了这个(https://regex101.com/r/3OVaO2/2

(<\w+\s*[^>]*)\s(?!href|title|alt)[\w\-\d]+=(?:(['"]).*?\2|\w+)

但是,这只会移除一个邪恶属性。问题是,使用 PCRE,您不能拥有可变长度的后视断言。如果将其切换到 ECMAscript,则可以执行此操作(https://regex101.com/r/3OVaO2/3

(?<=<\w+\s*[^>]*)\s(?!href|title|alt)[\w\-\d]+=(?:(['"]).*?\1|\w+)

这可能会做,你想要它做什么。尽管如此,这并不是净化 HTML 的圣杯。如果您认为输入不安全,请注意输出。

此外,标签的定义可能需要一些调整,因为可能存在诸如 之类的标签<some-element>,目前正则表达式无法检测到这些标签。


推荐阅读