如何在HTML和JavaScript中正确验证IPv4地址

本文介绍如何通过正则表达式结合逻辑校验,在前端准确验证ipv4地址格式与数值范围,避免仅依赖简单替换或不完整正则导致的误判。

在Web表单中,仅用正则限制输入字符(如 /[^0-9.]/g)或仅匹配 d{1,3}\.d{1,3}\.d{1,3}\.d{1,3} 是不够的——前者只是“防误输”,后者无法阻止 999.999.999.999 或 012.168.001.001 这类格式合法但语义非法的IP(如含前导零、超255值)。真正的IPv4验证需同时满足:

✅ 四段十进制数字(0–255)
✅ 每段不含前导零(除非该段就是 "0")
✅ 段间以英文句点 . 精确分隔
✅ 整体无空格、不可见字符

以下是一个健壮、可复用的验证方案:

✅ 推荐实现:HTML + JavaScript 组合校验

*
const isValidOctet = (str) => {
  // 允许 "0",但拒绝 "01", "00", "09" 等带前导零的非零数
  if (/^0\d+$/.test(str)) return false;
  const num = Number(str);
  return Number.isInteger(num) && num >= 0 && num <= 255;
};

const isValidIPv4 = (ip) => {
  const parts = ip.trim().split('.');
  return (
    parts.length === 4 &&
    parts.every(part => isValidOctet(part))
  );
};

document.addEventListener('DOMContentLoaded', () => {
  const input = document.getElementById('txtSignDSCIPAdd');

  input.addEventListener('input', (e) => {
    const value = e.target.value;
    e.target.setCustomValidity('');

    if (value && !isValidIPv4(value)) {
      e.target.setCustomValidity('Invalid IPv4 address: each octet must be 0–255, without leading zeros.');
    }
  });

  // 可选:提交时二次校验(增强可靠性)
  document.getElementById('ipForm').addEventListener('submit', (e) => {
    if (!isValidIPv4(input.value)) {
      e.preventDefault();
      input.reportValidity();
    }
  });
});

⚠️ 注意事项

  • pattern 属性仅做基础格式提示,不执行数值校验,且不触发 setCustomValidity,必须配合JS逻辑;
  • 正则 /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ 能提取四段,但需手动转为数字并校验范围与前导零;
  • 前导零判断关键:/^0\d+$/.test("012") → true(非法),/^0\d+$/.test("0") → false(合法);
  • 使用 Number(str) 安全转换:Number("00") === 0,Number("012") === 12,因此必须先检查字符串形式是否合规;
  • 不推荐使用 parseInt(str, 10) 处理IP段,因其会静默忽略后缀(如 "123abc" → 123),存在安全隐患。

✅ 总结

真正可靠的前端IPv4验证 = 结构正则匹配 + 字符串级前导零检查 + 数值范围校验。本方案兼顾用户体验(实时反馈)、语义正确性(符合RFC 791)与浏览器兼容性(支持所有现代浏览器),可直接集成至任意表单项目中。