【问题标题】:Regex that validates both IPv4 address and domain name验证 IPv4 地址和域名的正则表达式
【发布时间】:2021-07-22 12:52:06
【问题描述】:
if (isValidDomainName(addr)) {
     return true;
}
else if (isValidIPv4(addr)) {
     return true;
}

function isValidIPv4(addr){
    var regex = /^((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])$/;
    return regex.test(addr);
}

function isValidDomainName(name){
   var regex =/^((www\.([a-zA-Z0-9\-]{2,63}\.)+[a-zA-Z]{2,63})|(([a-zA-Z0-9\-]{2,63}\.)+[a-zA-Z]{2,63}))(\.[a-zA-Z]{2,63})?$/;
   return regex.test(name);
}

这是我写的代码。我面临一些问题。让我举几个例子:

  • google.com - 有效域名(预期)

  • 192.15.67.34 - 有效的 ipv4 地址(预期)

  • 192.45.dd.33

    预期:IP 无效

    ACTUAL : 有效的域名,因为当前系统在通过域名约束时对其进行验证

  • 192.67.77.xx

    预期:IP 无效

    ACTUAL : 有效的域名,因为当前系统在通过域名约束时对其进行验证

请倒一些贵重的cmets。

【问题讨论】:

  • 关于这个192.67.77.xx 我没有看到很多解决方法,因为它不像正则表达式失败。那一个有效的域名。
  • 鉴于您问题的当前形式,我的回答不会对您有太大帮助。您似乎正在尝试使用正则表达式来实现过于复杂的目标。您可能应该编写一个适合您特定需求的算法。您的域名正则表达式几乎不可读,并且似乎施加了非常具体的限制

标签: javascript regex ipv4


【解决方案1】:

据我所知,域名可以是由 ASCII 字母、数字和符号- 组合而成的任何“块”序列,块之间用. 分隔。最长可包含 255 个字符,并且必须以主域名结尾。

鉴于主域可以是任何被定义为块的东西,根据这个定义,192.45.dd.33192.67.77.xx 有效的域名。

您为什么不将您的输入验证为 IP 地址,然后仅当它未被识别为有效 IP 时才将其验证为域?

function isValid(addr) {
  if (isValidIPv4(addr)) {
    return true;
  } else if (isValidDomainName(addr)) {
    return true;
  }
  return false;
}

function isValidIPv4(addr){
    var regex = /^((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])$/;
    return regex.test(addr);
}

function isValidDomainName(name){
   var regex =/^((www\.([a-zA-Z0-9\-]{2,63}\.)+[a-zA-Z]{2,63})|(([a-zA-Z0-9\-]{2,63}\.)+[a-zA-Z]{2,63}))(\.[a-zA-Z]{2,63})?$/;
   return regex.test(name);
}

for (addr of [
  '192.168.1.52','192.168.1.xx', '192.ww.1.0', '255.255.255.000',
  'my-domain.com', 'my$IPp.com', 'google.192'
  ]) {
  console.log(addr, isValidIPv4(addr), isValidDomainName(addr), isValid(addr));
}
  

【讨论】:

  • "为什么不将您的输入验证为 IP 地址,然后仅当它未被识别为有效 IP 时才将其验证为域?"不会有同样的效果,即192.67.77.xx 将被验证为域名?
  • @FedericoklezCulloca 确实如此。但不应该吗?现在问题已被编辑,并且 OP 希望检测输入 IP 地址的失败尝试 似乎更清楚。这应该如何完成很大程度上取决于我们没有的上下文。
猜你喜欢
  • 2011-07-14
  • 2011-08-10
  • 1970-01-01
  • 2014-06-22
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多