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

标签 javascript regex

我知道有很多用于 URL 等的 RegEx,但我真的很困惑为什么这个不起作用。我正在尝试确保用户输入的是正确的网站,允许使用 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() 的测试用例

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

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

干杯

最佳答案

如果您尝试验证一个字符串,您需要将它锚定到字符串的开头和结尾:

var pattern = 
/<b>^</b>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})+<b>$</b>/;              (1 or more instance of .com or .co.uk)

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

提示:

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

关于javascript - JavaScript 中的主机名 url 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689550/

相关文章:

javascript - React原生IOS触摸事件需要在键盘打开时点击两次

javascript - 登录表单不与 MySQL 交互

javascript - 谷歌优化防闪烁片段超时

regex - rsyslog - 如何将特定日志文件转发到不同的目的地

javascript - 在第 X 个位置间隔处使用正则表达式替换字符串 (javascript)

javascript - Extend() 内的 Bookshelf JS 函数

javascript - typescript 错误 : Type 'undefined[]' is not assignable to type 'void'

java - 如何在嵌套字符串中使用正则表达式进行替换?

python - 如何标记正则表达式模式本身?

c# - Regex.IsMatch 不应该返回 true