正则表达式不知道 Url 何时结束

Regex Doesn't Know When Url Has Ended

我最近在这个正则表达式中发现了一个错误 '~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/([^&]+)\S*~i',。当我在一个字符串中有两个 link 并且其中一个在执行此正则表达式后出现时,它在 html.

中包含第二个 url

'~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/([^&]+)\S*~i', 转换为 '<br><iframe width="600" height="315" src="//clips.twitch.tv/embed?clip=&autoplay=false" frameborder="0" allowfullscreen></iframe><br>',

如果我将 https://clips.twitch.tv/SparklyGrotesqueStingrayPMSTwin and https://clips.twitch.tv/AbnegateSpinelessWoodcockCopyThis 放在同一个字符串中,它们在嵌入时会组合在一起,因此会导致错误。我试过使用 ?([?#]+.+)? ,它应该检查尾部是否有斜杠,但这没有帮助。即使不是两个 link 也会发生这种情况。第一个 link.

之后的任何字符串

只要 twitch 网址在视频 ID 后没有任何尾随字符,您就可以像这样贪婪地捕获所有可见字符:

~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/(\S+)~i

如果他们可能有查询字符串数据,那么您可以使用:

~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/([^\s&?]+)\S*~i

如果您知道 ID 仅按字母顺序排列,则可以使用此方法:

~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/([a-z]+)\S*~i