2013-10-30 51 views
2

我正在写一个短的动态脚本块,使得年初匹配协议相对URL确定一个URL要么启动:正则表达式在字符串

  • HTTP
  • HTTPS
  • 没有HTTP/HTTPS,而仅仅只是//技术

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

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

所以,我可以给它:

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

...它会工作

我知道这几乎是有,但如何我可以在t开始时说出“http/https还是斜杠”他串?然后在这些URL之后。

+0

'/ ^(HTTPS:?)?\/\ /'... – pawel

回答

1

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

/^(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.*$/ 
1

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

/^(https?:)?\/\/(?:youtube|vimeo)\.com.*$/i 
+0

他希望哈希和查询字符串了。他的尝试是'。* $'' –

+0

@RoyiNamir:谢谢编辑它。 – anubhava