代码之家  ›  专栏  ›  技术社区  ›  TheWelshManc

Regex不知道Url何时结束

  •  1
  • TheWelshManc  · 技术社区  · 7 年前

    我最近在这个正则表达式中发现了一个bug '~(?:<a.*?</a>|<img.*?</img>|<iframe.*?</iframe>)(*SKIP)(*FAIL)|\bhttps?://(?:www\.)?clips\.twitch\.tv/([^&]+)\S*~i', . 当我在一个字符串中有两个链接,其中一个在执行这个正则表达式之后出现时,它会在html中包含第二个url。

    '~(?:<a、 *?</a>|&书信电报;图像。*?</img>|&书信电报;iframe.*?</iframe>)(*跳过)(*失败)|\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/SparklyGrotesqueStingrayPMSTwin https://clips.twitch.tv/AbnegateSpinelessWoodcockCopyThis 在同一个字符串中,它们在嵌入时结合在一起,从而导致错误。我试过用 ?([?#]+.+)? 它应该检查是否有一个尾随斜杠,但这没有帮助。即使不是两个链接,也会发生这种情况。只是第一个链接后的任何字符串。

    1 回复  |  直到 7 年前
        1
  •  1
  •   mickmackusa Tom Green    7 年前

    只要twitch URL在视频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
    

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