regex 正则表达式,检查排除字符串是否有许多相似的html标签

qlfbtfca  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(111)

我正在尝试检查这个嵌入Vimeo iframe:

<iframe src="https://player.vimeo.com/video/800711372?h=589188fdd4&title=0&byline=0&portrait=0" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>

字符串
在字符串中只出现一次。这意味着:

<iframe.....></iframe><iframe.....></iframe> (doesnt match)
<iframe.....></iframe> (match)


不会匹配。我用了这个模式:

^(<iframe[^(src)]*?src\=\"https?\:\/\/player\.vimeo\.com\/video\/[^>]*?>)<\/iframe>$


它工作得很好,但我只是觉得这不是一个很好的主意。有没有其他的方法来实现这一点?我做了一些研究,人们说使用前瞻,负前瞻。
编辑:哦,我的正则表达式工作的原因是在我的代码中。我在应用正则表达式之前删除了所有新行。所以如果我们有:

<iframe.....></iframe>
<iframe.....></iframe>
<iframe.....></iframe> (multiple, keep the line breaks)


我的正则表达式将匹配所有。

5f0d552i

5f0d552i1#

我不认为这是一个HTML问题。
假设您要检查字符串中是否出现子字符串。
怎么做?有两个好方法。
1.主动检查子串出现的前后。
正则表达式引擎不会给予匹配。如果你搜索子字符串,
接着是一个否定的Assert,它不存在下游,引擎
将只匹配满足Assert的最后一次出现。
因此一个字符一个字符的前后检查,就知道只有一个子串。
这是相当缓慢的。
1.被动地匹配子字符串的2个示例。被动地意味着不贪婪.*?
匹配第一子串,非贪婪匹配 OPTIONALLY 第二次出现。
引擎将努力匹配这两个事件。第二个事件
在捕获组中。这是在成功匹配时要检查的标志。
如果该组为 not NULL,则正则表达式找到2个或更多子字符串。
如果该组 * 为 * NULL,则100%保证只有一个子字符串。
请注意,如果正则表达式匹配,它至少会找到一个子字符串。
范例:

(<iframe\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>\s*</iframe>)(?:(?:[\S\s]*?(<iframe\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>\s*</iframe>))|)

字符串
失败,组2不是NULL https://regex101.com/r/DmThDT/1
通过,组2为NULL https://regex101.com/r/393BPn/1
HTML应该用某种HTML编辑器来解析,但是我相信这个问题不是关于这个的。
我在htlm标签的尝试是抛出,但这可能是任何东西。
概述

(                             # (1 start)
   <iframe \s+ 
   (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
   > \s* </iframe>
)                             # (1 end)
(?:
   (?:
      [\S\s]*? 
      (                             # (2 start)
         <iframe \s+ 
         (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
         > \s* </iframe>
      )                             # (2 end)
   )
 | 
)

相关问题