0

我正在使用这个正则表达式来检测用户在输入域名时是否包含了协议——我不希望他们这样做:

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**

应该通过但字符 h,t,t 使其失败

我想我需要单词边界 \b 但我不确定在哪里:

(/^\b[^http:\/\/|www.]\b[a-zA-Z0-9\-]+\.( .....

或者

(/^[^\bhttp:\b\/\/|\bwww\b.][a-zA-Z0-9\-]+\.( .....

我知道我很接近 - 经过 4 年的开发,正则表达式仍然让我感到悲伤

4

3 回答 3

4

实际上,您需要前瞻

/^(?!https?:\/\/|www\.)[a-zA-Z0-9\-]+\.(co\.uk|com|net|biz|org|org\.uk|eu|me\.uk)$/i

另请参阅这个简短的演示


简短说明:

  • ^:匹配字符串的开头(假设是单行输入)。

  • (?!<...>):消耗任何字符,但向前看并确保字符串的下一部分匹配<...>(负向前看)。

  • https?:\/\/|www\.:匹配http://https://www.?在's'之后使其成为“可选”)。

  • [a-zA-Z0-9\-]+:匹配任何包含一个或多个字母数字字符或“-”的序列。

  • \.: 匹配一个点 ('.')。

  • (co\.uk|com|net|biz|org|org\.uk|eu|me\.uk): 匹配co.ukor comor or netor ...

  • $: 匹配字符串的结尾(假设是单行输入)。

于 2013-06-20T09:33:58.967 回答
2

正则表达式中的方括号表示一个字符类,所以

[^http:\/\/|www.]

与任何非 h、t、p、:、/、|、w 或 的单个字符的含义相同[^:/|.htpw]并匹配。你可能想要一个否定的前瞻

^(?!https?:\/\/|www\.)

匹配不以http://,https://www.

于 2013-06-20T09:35:27.367 回答
0

如果您只想识别没有协议和子域的域名,为什么不使用这个正则表达式:

^([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 的域名包括非连续(非尾随、非前导)连字符。

于 2013-06-20T09:41:59.673 回答