【问题标题】:Regex match on script tags that DO NOT contain certain attributes不包含某些属性的脚本标签上的正则表达式匹配
【发布时间】:2019-12-06 22:48:04
【问题描述】:

我正在努力为 html 扫描构建正则表达式。正则表达式应匹配包含任何一个 async defer 属性的任何<script> html 元素。

单元测试:

  • <script defer src="a.js"> 应该 not match
  • <script src="a.js" defer> 应该 not match
  • <script src="a.js"> 应该 match
  • <script async src="a.js">应该not match
  • <script src="a.js" async> 应该 not match

我已经摆弄了一个解决方案,用于在单个属性上设置它(分别为^.*<script((?!defer).)*$^.*<script((?!async).)*$,并且我还创建了一个匹配的 html 元素 /em> 包含任一属性 (<script.+(?=defer|async).+>) 但我无法反过来理解它。

有什么想法吗?

【问题讨论】:

  • 我强烈建议您使用适当的 HTML 解析器。您正在尝试做的事情充满危险,因为有很多情况您没有考虑,并且正则表达式不是适合这项工作的工具。有关示例,请参阅htmlparsing.com/regexes.html
  • 嗨@AndyLester - 我绑定到一个特定的html扫描工具,只允许规则生成器中的正则表达式。好消息是它只标记匹配项,稍后由编辑器/编码器处理。感谢您提供的链接,我已经转交给管理我们正在使用的工具的同事。

标签: regex


【解决方案1】:

您的实验非常接近!

尝试以下正则表达式,并通过您的示例 here 以及其他一些可能出现的用例进行演示,例如 <script test defer src="a.js"><script test src>

<script(?:(?!defer|async).)*?>

说明

  • &lt;script - &lt; 字符后跟单词 script
  • (?:(?!defer|async).)*? - 对单词 deferasync 后跟单个字符的负前瞻,尽可能匹配多次,但更喜欢更少的匹配项(即匹配单个字符前面没有单词 deferasync,尽可能匹配多次,但希望更少 匹配)
  • &gt; - &gt; 字符

测试

|--------------------------------|-----------|
| Use case                       | Matches   |
|--------------------------------|-----------|
| <script defer src="a.js">      | NO        |
| <script async src="a.js">      | NO        | 
| <script src="a.js">            | YES       |
| <script test src="a.js">       | YES       |
| <script test async src="a.js"> | NO        |
| <script src="a.js" defer>      | NO        |
| <script src="a.js" async>      | NO        |
| <script test src>              | YES       |
|--------------------------------|-----------|

【讨论】:

  • 嗨@NoodleOfDeath - 谢谢。它解决了它,但我很确定我自己永远也想不通 :-) regex101.com/r/vMm7TD/1 用于未来的单元测试参考。
  • 我更新了我的答案(通过在* 之后添加懒惰的?)来解决像&lt;script src="a.js"&gt;&lt;script test src="a.js"&gt; 这样的同一行情况,这应该导致两个匹配而不是一个,如您所见@987654323 @
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2015-04-18
  • 2011-10-02
  • 2011-03-31
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多