正则表达式,用于匹配字符串开头的协议相对 URL

RegExp for matching protocol relative URL at beginning of string

本文关键字:协议 相对 URL 开头 字符串 用于 正则表达式      更新时间:2023-09-26

我正在编写一个简短的动态脚本,确保URL以以下任一开头:

  • http
  • https
  • 没有 http/https,而只是 // 技术

到目前为止,我的正则表达式:

/^(http|https|://)youtube.com|vimeo.com.*$/

所以我可以给它:

  • http://youtube.com
  • https://youtube.com
  • //youtube.com

。它会起作用

我知道它快到了,但是我怎样才能让它在字符串的开头说"http/https 或只是斜杠斜杠"?然后是这些 URL 之后的任何内容。

如果你想知道你的正则表达式出了什么问题,这里有一个解释:

/^(http|https|://)youtube.com|vimeo.com.*$/

第一件事是:你需要将youtube|vimeo部分封装成一个组(我们会在前面添加?:,因为我们不想捕获它)。 否则它实际上是在寻找(^(http|https|://)youtube.com)|(vimeo.com),这根本不是你想要的。此外,你会想要转义你的月经,因为这是点字符(我假设你不希望"youtubescom"匹配),以及你的正斜杠。

现在,我们有:

/^(http|https|:'/'/)(?:youtube'.com|vimeo'.com).*$/

因此,在这里我们检查"http","https"或"://"是否开始一个字符串,并在"youtube.com"或"vimeo.com"之前。但是,我们真正想要的是检查"http://","https://"或只是"//"是否在以下任一之前:

/^(http:'/'/|https:'/'/|'/'/)(?:youtube'.com|vimeo'.com).*$/

你可以停在那里,这就是你的答案。但是,让我们通过查找冗余来继续进行一些清理。首先,我们的两个域都有".com",因此我们可以简单地(?:youtube|vimeo)'.com该部分。接下来,我们的协议前缀都有"//",所以我们可以把它拉到: (http:|https:)'/'/ .但是,现在"http:"或"https:"必须以字符串开头。由于我们希望它们是可选的,因此我们将在之后添加一个"",因此我们得到(http:|https:)?'/'/。现在,由于它们是如此接近,我们真正想要的只是 ssl 的可选"s"。最后,我们终于可以得到:

/^(https?:)?'/'/(?:youtube|vimeo)'.com.*$/

你可以试试这个正则表达式:

 /^(https?:)?'/'/(?:youtube|vimeo)'.com.*$/i