2

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

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

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

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

所以我可以给它:

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

......它会工作

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

4

2 回答 2

2

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

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

首先要做的是:您需要将 youtube|vimeo 部分封装为一个组(我们将添加?:到前面,因为我们不想捕获它)。否则它实际上是在寻找(^(http|https|://)youtube.com)|(vimeo.com)根本不是你想要的。此外,你会想要逃避你的时期,因为那是 dotall 字符(我假设你不希望“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.*$/
于 2013-10-30T20:00:09.623 回答
1

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

 /^(https?:)?\/\/(?:youtube|vimeo)\.com.*$/i
于 2013-10-30T19:17:26.440 回答