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

时间:2018-11-03 16:42:50

标签: php regex preg-replace

我最近在此正则表达式'~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/([^&]+)\S*~i',中发现了一个错误。当我在一个字符串中有两个链接,并且其中一个在执行此正则表达式后出现时,它将在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=$1&autoplay=false" frameborder="0" allowfullscreen></iframe><br>',

如果我将https://clips.twitch.tv/SparklyGrotesqueStingrayPMSTwinhttps://clips.twitch.tv/AbnegateSpinelessWoodcockCopyThis放在同一字符串中,则它们在嵌入时会合并在一起,因此会引起错误。我尝试使用?([?#]+.+)?来检查斜线是否为斜杠,但这没有帮助。即使不是两个链接,也会发生这种情况。在第一个链接之后的任何字符串。

1 个答案:

答案 0 :(得分:1)

只要抽搐网址在视频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