【问题标题】:Remove all inline html attributes, but leave some删除所有内联 html 属性,但保留一些
【发布时间】:2019-03-12 16:41:48
【问题描述】:

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

到目前为止我得到的是

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

用于标记所有内联元素,但仍需要类似文本

href="test" Test

它周围没有任何 html,此外,它采用 all 内联属性。 在此处查看我的示例文本:

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

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

【问题讨论】:

标签: html regex


【解决方案1】:

正如 cmets 中已经提到的,Regex 不是这里的方法。

也就是说:我想出了这个 (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 的圣杯。如果您认为输入不安全,请注意输出。

此外,标签的定义可能需要一些调整,因为可能有像&lt;some-element&gt; 这样的标签,目前正则表达式无法检测到这些标签。

【讨论】:

  • 谢谢,我知道这不会解决所有问题,但我可以使用第一个正则表达式来删除整个标签,这对我来说已经足够了。我发现当等号周围有空格时,浏览器仍然使用这些属性,所以我得到了这个正则表达式:(&lt;\w+\s*[^&gt;]*)\s(?!href|title|alt)[\w\-\d]+\s*=\s*(?:(['"]).*?\2|\w+) 我知道我仍然必须处理 href 标记(并在那里删除诸如“javascript:”之类的东西)。我正在考虑稍后使用 html 净化器。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
相关资源
最近更新 更多