JavaScript 中的主机名 url 正则表达式

Host name url regex in JavaScript

本文关键字:url 正则表达式 主机 JavaScript      更新时间:2023-09-26

我知道有很多正则表达式用于URL等,但我真的很困惑为什么这个不起作用。我试图确保用户的条目是一个正确的网站,允许www或不允许www。

var pattern = 
/http(s?):'/'/                      (http:// or https://)
(?:[a-zA-Z]+'.){0,1}                (0 or 1 instance of www)
(?:[a-zA-Z0-9][a-zA-Z0-9-]+){1}     (1 instance of a domain name)
(?:'.[a-zA-Z]{2,6})+/;              (1 or more instance of .com or .co.uk)

它适用于以下使用 pattern.test() 的测试用例

  • http://www.stackoverflow.com ->真实
  • http://stackoverflow.com ->真实
  • https://stackoverflow.com ->真实
  • htts://stackoverflow.com -> 假
  • http:/stackoverflow.com -> false

但是,即使我明确告诉正则表达式它必须与.com或 .co.uk 等匹配,它也允许我写这样的废话:

  • http://www.stackoverflow -> 正确(错误)
  • http://www.stackoverflow. -> 真(错)
  • http://www.stackoverflow.c -> 真(错)

我一直在绞尽脑汁尝试不同的组合,但我可以理解为什么即使我明确表示必须有一个或多个域扩展,那部分似乎并不重要?

干杯

如果要尝试验证字符串,则需要将其锚定到字符串的开头和结尾:

var pattern = 
/^http(s?):'/'/                      (http:// or https://)
(?:[a-zA-Z]+'.){0,1}                (0 or 1 instance of www)
(?:[a-zA-Z0-9][a-zA-Z0-9-]+){1}     (1 instance of a domain name)
(?:'.[a-zA-Z]{2,6})+$/;              (1 or more instance of .com or .co.uk)

对于www.stackoverflow,第一组不匹配(因为你说它是可选的),然后第二组匹配www,第三组匹配.stacko

技巧:

  • {1}不是必需
  • {0,1}相当于?
  • 由于您没有使用任何捕获,因此(s?)可能只是s?