我正在尝试匹配以下视频网址:
<iframe width="420" height="315" src="//www.youtube.com/embed/F40ZBDAG8-o?rel=0" frameborder="0" allowfullscreen></iframe>
我有以下内容:
^<iframe
(\swidth="\d{1,3}")?
(\sheight="\d{1,3}")?
(\salt=""[^""<>]*"")?
(\stitle=""[^""<>]*"")?
\ssrc="//(www.youtube.com|player.vimeo.com)/[-a-z0-9+&@#/%?=~_|!:,.;\(\)]+"
(\sframeborder="[^""<>]*")?
(\sallowfullscreen)?
\s?/?></iframe>$
这是有效的,但我不能相信 youtube 将始终提供遵循此结构的嵌入链接。如果他们将 width
属性移至 src
之后,我的正则表达式将失败。
有什么方法可以进行与顺序无关的分组来解决这个问题吗?
最佳答案
您可以将每个搜索词设置为前瞻 - 这些搜索词不会消耗字符串,因此它们可以按任何顺序排列。示例:
<iframe (?=.*height="\d{1,3}")(?=.*width="\d{1,3}").*
将匹配两者
<iframe width="123" height="321"
和
<iframe height="321" width="123"
我相信您可以自己完成此操作(添加您想要匹配的所有术语)。
注意 - 这个“匹配” - 它不“提取”。但它会告诉您所有这些术语都以任何顺序出现在表达式中。
编辑自从我开始写这个答案以来,出现了许多评论,这些评论改变了我对您的请求的理解。如果您“只是”想提取 src=
内容,您只需这样做
<iframe.*?src="([^"]+)"
和匹配(括号中的内容)将是第一个和第二个双引号之间的任何内容。通常有比正则表达式更好的工具来解析 HTML - 我个人更喜欢 BeautifulSoup (Python)。
关于regex - 与顺序无关的正则表达式 - 有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20576719/