html - 删除所有内联 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 属性处理一些东西。
解决方案
正如评论中已经提到的,正则表达式不是这里的方法。
也就是说:我想出了这个(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>
,目前正则表达式无法检测到这些标签。
推荐阅读
- sql - SELECT ANY TABLE 权限在 Oracle 中如何工作?
- excel - VBA - 从 XLSX 中删除可以在单元格中找到特定文本的行
- java - 是否可以在@WebInitParam 中动态获取值?
- angular - To call different dialog window based on the button present in the component
- apache-spark - 在 YARN 中启用 CPU 调度真的会改善 Spark 中的并行处理吗?
- c# - 如何同时显示来自服务器端流畅验证和客户端验证的错误消息?
- javascript - Angular 6 - 在构造函数中对订阅函数进行单元测试
- r - 构建一个计算多个向量元素的函数
- ios - VerticalCardSwiper 显示错误。显示我写的下面的代码是零
- vba - VBA WORD 识别段落是列表还是表格