我们要检查网址是否与mail.google.com或mail.yahoo.com(也是其中的子域名)相匹配,但不是在问号后包含此字符串的网址。我们还希望字符串“mail.google.com”和“mail.yahoo.com”在URL的第三个斜杠之前出现,例如,https://mail.google.com/
被接受,https://www.facebook.com/mail.google.com/
不被接受,并且https://www.facebook.com/?mail=https://mail.google.com/
也不被接受。 https://mail.google.com.au/
也不被接受。是否可以使用正则表达式?
var possibleURLs = /^[^\?]*(mail\.google\.com|mail\.yahoo\.com)\//gi;
var url;
// assign a value to var url.
if (url.match(possibleURLs) !== null) {
// Do something...
}
目前这将匹配https://mail.google.com/
和https://www.facebook.com/mail.google.com/
,但我们不希望匹配https://www.facebook.com/mail.google.com/
。
修改:我希望匹配任何协议(任何不包含"?"
和"/"
的字符串),然后是斜杠"/"
两次(字符串和斜杠都可以两次),然后任何不包含"?"
和"/"
的字符串(如果它不是空的,它必须以点"."
结束),然后(mail\.google\.com|mail\.yahoo\.com)\/
。不区分大小写。
答案 0 :(得分:3)
不好笑 - 但为什么它必须是正则表达式?
是否有理由不使用URL(或Chrome和Safari中的webkitURL)简化流程 - URL constructor只需要一个字符串,然后包含每个部分的属性URL。它是否支持您想要支持的所有主机类型,我不知道。
当然,在此之后你可能仍然需要一个正则表达式(虽然你真的要检查主机名是否以yahoo.com或google.com结尾),但你只是在主机名上运行它URL对象而不是整个URI。
API并不是普遍存在,但似乎得到了相当好的支持,无论如何,如果这是客户端验证,那么我希望你也可以在服务器上检查它,因为回避javascript验证很容易。
答案 1 :(得分:1)
^([-a-z]+://|^cid:|^//)([^/\?]+\.)?mail\.(google|yahoo)\.com/
应该做的伎俩
第一个^
表示"匹配行"的开头,第二个表示否定允许的字符,因此不允许使用斜杠/
。
的Nb。您仍然必须转义斜杠,或将其用作new RegExp(string)
中的字符串:
new RegExp('^([-a-z]+://|^cid:|^//)([^/\?]+\.)?mail\.(google|yahoo)\.com/')
答案 2 :(得分:1)
怎么样
^[a-z]+:\/\/([^.\/]+\.)*mail\.(google|yahoo).com\/
^
将正则表达式锚定在字符串的开头
[a-z]+
符合协议。如果您需要一组特定的协议,那么(https?|ftp)
可以完成工作
([^.\/]+\.)*
匹配子主题部分
答案 3 :(得分:0)
好的,我发现它适用于:
var possibleURLs = /^([^\/\?]*\/){2}([^\.\/\?]+\.)*(mail\.google\.com|mail\.yahoo\.com)\//gi;