删除所有内联html属性,但保留一些

删除所有内联html属性,但保留一些,html,regex,Html,Regex,我正试图用preg_replace编写一个php函数,该函数删除html元素的所有内联属性,但希望保留诸如“href”、“title”、“alt”之类的属性 我现在得到的是 ([\w\-.:]+)\s*=\s*("[^"]*"|'[^']*'|[\w\-.:]+) 用于标记所有内联元素,但它仍然需要像 href="test" Test 此外,如果周围没有任何html,这将获取所有内联属性。 请参见我的示例文本: [ 目标是删除任何危险的html元素。 我知道我必须在一个额外的函数中为href

我正试图用preg_replace编写一个php函数,该函数删除html元素的所有内联属性,但希望保留诸如“href”、“title”、“alt”之类的属性

我现在得到的是

([\w\-.:]+)\s*=\s*("[^"]*"|'[^']*'|[\w\-.:]+)
用于标记所有内联元素,但它仍然需要像

href="test" Test
此外,如果周围没有任何html,这将获取所有内联属性。 请参见我的示例文本:

[

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

正如评论中已经提到的,Regex不是解决这个问题的方法

也就是说:我想出了这个

但是,这只会删除一个邪恶的属性。问题是,使用PCRE时,不能有可变长度的lookbehind断言。如果将其切换到ECMAscript,则可以执行此操作

<>这可能是你想做的事情。然而,这不是清理HTML的圣杯。如果你不认为你的输入是安全的,就要小心你的输出。


此外,标记的定义可能需要一些调整,因为可能存在正则表达式当前未检测到的标记,如。

我假设,通过内联元素,您是指标记的属性?正则表达式不太适合此任务;您需要一个适当的HTML解析器。您需要注意两件事:和参见元素≠ 属性你说想留下一些像“href”的元素,目标是删除任何危险的html元素,但href是一个危险的属性,可以用来触发XSS攻击。谢谢,我知道这不会消除所有问题,但我可以使用第一个正则表达式来删除整个标记,这对我来说就足够了。我发现浏览器仍然可以当等号周围有空格时,请关闭属性,所以我得到这个正则表达式:]*\s?!href | title | alt[\w\-\d]+\s*=\s*?:['].*?\2 |\w+我知道我仍然需要处理href标记并删除javascript:。我正在考虑以后使用html净化器。
(<\w+\s*[^>]*)\s(?!href|title|alt)[\w\-\d]+=(?:(['"]).*?\2|\w+)
(?<=<\w+\s*[^>]*)\s(?!href|title|alt)[\w\-\d]+=(?:(['"]).*?\1|\w+)