我的域名Regex需要改进
我使用此正则表达式来检测用户在输入域名时是否包含协议-我不希望他们这样做:我的域名Regex需要改进,regex,Regex,我使用此正则表达式来检测用户在输入域名时是否包含协议-我不希望他们这样做: if (/^[^http:\/\/|www.][a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i.test(inp2){ ... ok ... } 它在97%的时间里都能工作,然后我意识到为什么有些名字会失败——它与整个名字不匹配 协议将匹配任何具有字符h、t、t、p或w、w、w的内容,而不是将其视为完整的单词“http/:”或“www.” 我
if (/^[^http:\/\/|www.][a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i.test(inp2){
... ok ...
}
它在97%的时间里都能工作,然后我意识到为什么有些名字会失败——它与整个名字不匹配
协议将匹配任何具有字符h、t、t、p或w、w、w的内容,而不是将其视为完整的单词“http/:”或“www.”
我在测试时发现:
**hattooflat.com**
这些都应该通过,但是这些字符使它失败了
我想我需要单词边界\b但我不确定在哪里:
(/^\b[^http:\/\/|www.]\b[a-zA-Z0-9\-]+\.( .....
或
我知道我已经很接近了——在4年的发展之后,正则表达式仍然让我感到悲伤事实上,你需要:
/^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i
另请参见此
简要说明:
:匹配字符串的开头(假设为单行输入)^
:不要使用任何字符,但向前看,并确保字符串的下一部分不匹配(?!)
(负向前看)
:匹配https?:\/\/\124; www\.
或http://
或https://
(www.
在“s”之后使其成为“可选”)?
:匹配包含一个或多个字母数字字符或“-”的任何序列[a-zA-Z0-9\-]+
:匹配一个点('.')\。
:匹配(co\.uk | com | net | biz | org | org\.uk | eu | me\.uk)
或co.uk
或com
或net
:匹配字符串的结尾(假设为单行输入)$
实际上,你需要:
/^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i
另请参见此
简要说明:
:匹配字符串的开头(假设为单行输入)^
:不要使用任何字符,但向前看,并确保字符串的下一部分不匹配(?!)
(负向前看)
:匹配https?:\/\/\124; www\.
或http://
或https://
(www.
在“s”之后使其成为“可选”)?
:匹配包含一个或多个字母数字字符或“-”的任何序列[a-zA-Z0-9\-]+
:匹配一个点('.')\。
:匹配(co\.uk | com | net | biz | org | org\.uk | eu | me\.uk)
或co.uk
或com
或net
:匹配字符串的结尾(假设为单行输入)$
正则表达式中的方括号表示字符类,因此
[^http:\/\/|www.]
表示与[^:/|.htpw]
相同,并匹配不是h、t、p、:、/、|、w或的任何单个字符。你可能想要一个消极的前瞻
^(?!https?:\/\/|www\.)
它与不以
http://
、https://
或www开头的字符串相匹配。正则表达式中的方括号表示字符类,因此
[^http:\/\/|www.]
表示与[^:/|.htpw]
相同,并匹配不是h、t、p、:、/、|、w或的任何单个字符。你可能想要一个消极的前瞻
^(?!https?:\/\/|www\.)
它匹配的字符串不以http://
、https://
或www.
开头。如果您只想标识没有协议和子域的域名,为什么不使用此正则表达式:
^([a-zA-Z0-9]{2}|([a-zA-Z0-9][a-zA-Z0-9\-])+[a-z0-9])\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$
正则表达式允许长度为2的域名和长度为3的域名包括非连续(非尾随、非前导)连字符。如果您只想识别没有协议和子域的域名,为什么不使用此正则表达式:
^([a-zA-Z0-9]{2}|([a-zA-Z0-9][a-zA-Z0-9\-])+[a-z0-9])\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$
正则表达式允许长度为2的域名和长度为3的域名包括非连续(非尾随、非前导)连字符。您使用的正则表达式引擎是什么?如果引擎可以支持负面外观,这就是您可以使用的。您可能只想使用([a-Za-z0-9\-]+\)?[a-z]{2,6}
,而不是输入大量任意TLD。对不起,不知道你的意思-但我使用jquery 1.8.3/Javascript@Niels Keurentjes我通常使用你的想法,但在这个应用程序中,重要的是只允许那些TLD声明@speakr你能告诉我需要做什么吗?你使用的是什么正则表达式引擎?如果引擎可以支持负面外观,这就是您可以使用的。您可能只想使用([a-Za-z0-9\-]+\)?[a-z]{2,6}
,而不是输入大量任意TLD。对不起,不知道你的意思-但我使用jquery 1.8.3/Javascript@Niels Keurentjes我通常使用你的想法,但在这个应用程序中,重要的是只允许那些声明的TLD@speakr你能告诉我我需要做什么吗?重要的是只允许声明的TLD,没有其他的-也^[a-z0-9\-]允许http,www.它们就像域名一样,都是魔术师name@user962902好的,我修正了。重要的是,只允许TLD声明,不允许其他人-也^[a-z0-9\-]允许http,www-它们只是域中的字符name@user962902可以我修正了。好的,第一个回答的人一直在删除他的帖子,所以无法标记——因为你的帖子也有一个很好的提琴例子和解释,这将有助于我将来学习,我标记了你的帖子——很多thanks@user962902这个答案和普斯基斯之间有很大区别。请看伊恩·罗伯茨的回答,它解释了这一点。我知道现在-这就是为什么它被删除了,因为它是错误的-虽然产生了正确的结果-但是我无法与普乌斯基索克沟通,给出第一个答案的人一直在删除他的帖子,所以无法标记它-因为你的文章也有一个很好的例子和解释