JavaScript中常见验证方式:手机号、电话等的校验

文章标题:

JavaScript中常见验证手段:手机号、电话等的校验

文章内容:

目录

解析

在表单验证的场景中,getValueFromEventpatternvalidator 是三种不同的验证机制。

方法 作用 适用场景
getValueFromEvent 从表单事件(像 onChange)中提取值,一般用于预处理输入的数据 需要自定义事件值解析的情况(比如文件上传)
pattern 通过正则表达式对输入的值进行格式校验,属于声明式规则 简单格式校验(例如手机号、邮箱)
validator 通过函数来实现自定义逻辑验证,支持异步操作和复杂条件判断 动态校验(比如密码强度、联动字段)

对于手机号码验证的解析

第一位是以【1】开头,第二位是【3、4、5、7、8】中的一个,第三位及之后是0 - 9的数字。由此可以得到一个符合要求的手机号码验证正则表达式(不适用于电话)。例如:^1(3|4|5|7|8)\d{9}$ 或者 ^1[34578]\d{9}$ 或者 ^1[34578][0 - 9]{9}$ 或者 ^1[3,4,5,7,8][0 - 9]{9}$

  • ^ 表示开始。
  • 正则里的中括号[]只能匹配其中一个字符。
  • 如果要匹配特定几组字符串,就得用小括号()加上或|
  • |在中括号里也是一个字符,不代表或。
  • [3457]能匹配3或者4或者5或者7,而(3457)是把3457当作一个整体来匹配,要是想达到和中括号一样的效果可以用(3|4|5|7)
  • [34|57]会匹配3或者4或者|或者5或者7,而(34|57)匹配34或者57。
  • \d{9}:匹配9个数字(0 - 9任意组合的9个数字)。其中,\d代表一个数字字符,{9}表示前面的模式(即\d)要重复9次。

总结

方案 推荐度 适用场景
rules + pattern ⭐⭐⭐⭐⭐ 简单正则验证(推荐)
rules + validator ⭐⭐⭐⭐ 复杂自定义验证
手动checkPhone 遗留代码或特殊需求

最佳实践:优先采用 Ant Design 的 rulespattern,避免手动操作 DOM 和使用 alert

写法1:(不推荐)

function checkPhone(){
    var phone = document.getElementById('phone').value;
    if(!(/^1[34578]\d{9}$/.test(phone))){
        alert("手机号码有误,请重填");  
        return false;
    }
}

或者
function checkPhone(){
    var phone = document.getElementById('phone').value;
    var phoneRegex = /^1(3|4|5|7|8)\d{9}$/
    if(!(phoneRegex.test(phone))){
        alert("手机号码有误,请重填");  
        return false;
    }
}

// 在提交表单时调用
handleSubmit = (e) => {
  e.preventDefault();
  if (checkPhone()) {
    // 验证通过,提交表单
    this.props.form.validateFields((err, values) => {
      if (!err) {
        console.log('提交数据:', values);
      }
    });
  }
};

// handleSubmit = () => {
//    const phone = document.getElementById('phone').value;
//    if (!this.checkPhone(phone)) {
//     alert("手机号码有误");  // 手动触发验证‌
//   }
// };

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                rules:[{
                    required: true,
                    message: '请输入正确的联系电话!',
                }],
                initialValue: '',
            })(
                <Input id='phone' />
            )}
        </FormItem>
    </Col>
    <Button onClick={this.handleSubmit}>提交</Button>
</Row>
⚠️ 缺点
  • 直接操作 DOM(document.getElementById),不符合 React 的最佳实践。
  • 错误提示用 alert,用户体验较差(Ant Design 的表单错误提示更优雅)。

写法2:pattern 正则表达式

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                rules:[
                    {
                        required: true,
                        message: '请输入联系电话!'
                    },
                    {
                        pattern: /^1(3|4|5|7|8)\d{9}$/,
                        message: '请输入11位有效手机号!'
                    },

                ],
                initialValue: '',
            })(
                <Input id='phone'  maxLength={11} />
            )}
        </FormItem>
    </Col>

</Row>
优点
  • 不需要额外写 checkPhone 函数,直接用 pattern 进行正则验证。
  • Ant Design 会自动处理错误提示,不需要手动 alert

写法3:validator 自定义验证(更灵活)

(需求:除了汉字和字母不能输入以外,其他的都可输入)

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                rules:[
                    {
                        required: true,
                        message: '请输入联系电话!'
                    },
                    {
                        pattern: /^1[3-9]\d{9}$/,
                        message: '请输入11位有效手机号!'
                    },
                    {
                    validator: (rule, value, callback) => {
                        const reg = new RegExp('[\u4E00-\u9FA5]')
                        const reg1 = new RegExp('[A-Za-z]')
                        if(reg.test(value)){
                            callback('手机号码不能输入汉字!')
                        } else if (reg1.test(value)){
                            callback('手机号码不能输入字母!')
                        } else {
                            callback()
                        }
                    }
                }],
            })(
                <Input id='phone' maxLength={11} />
            )}
        </FormItem>
    </Col>

</Row>
优点
  • 可以自定义更复杂的验证逻辑(如异步校验)。
  • 仍然不需要手动操作 DOM(document.getElementById)。

扩展建议

  1. 国际号码支持
    若需支持国际号码,可替换正则为:
pattern: /^(?:\+?86)?1[3-9]\d{9}$|^(?:\+?\d{1,3})?\d{6,15}$/
  1. 动态校验
    通过 setFieldsValue 实现联动校验(比如区号 + 座机号场景)。

  2. 防抖优化
    频繁校验时建议添加防抖:

import { debounce } from 'lodash';
validator: debounce((rule, value, callback) => { ... }, 300)
// 代码:
rules: {
  username: [
    { required: true, message: '必填项' },
    {
      validator: debounce((rule, value, callback) => {
        if (/[^a-z]/.test(value)) callback('仅允许小写字母');
        else callback();
      }, 1000),
      trigger: 'blur'  // 明确防抖触发条件。防抖场景必须声明‌:防抖函数需绑定明确的事件(如 blur 或
change)‌
    }
  ]
}
场景 防抖配置 优势
输入实时搜索 delay: 300ms 减少搜索接口调用‌
异步唯一性校验 delay: 1000ms 避免频繁请求‌
多字段联合校验 共享防抖实例 统一控制校验节奏‌
  • trigger: 'blur' 表示输入框失去焦点时触发校验,适合实时性要求较低的场景(如避免输入中途频繁提示)‌17。
  • trigger: 'change' 会在值变化时立即校验,适合需要即时反馈的交互(如密码强度检测)‌
场景 是否需要显式声明 原因
需要实时校验 可选(建议声明) 明确控制触发时机,避免依赖默认行为‌
仅提交时校验 可不写 默认行为已满足需求‌
防抖场景 必须声明 防抖函数需绑定明确的事件触发点(如 blur),否则无法生效‌

电话号码校验,上面的pattern方法、validator方法都适用

function phoneValid(number) {
    // 去除任何非数字字符
    const cleaned = number.replace(/\D/g, '');

    // 定义正则表达式验证规则
    const mobilePattern = /^1[3-9]\d{9}$/; // 手机号
    const tellPattern = /^0\d{2,3}-?\d{7,8}$/; // 电话号

    // 验证是否符合手机号码或座机号码格式
    if (mobilePattern.test(cleaned) || tellPattern.test(cleaned)) {
        return true;
    } else {
        return false;
    }
}

// 示例用法
console.log(phoneValid('13800138000')); // true
console.log(phoneValid('010-12345678')); // true
console.log(phoneValid('12345678')); // false
console.log(phoneValid('021-87654321')); // true
console.log(phoneValid('18912345678')); // true

空格校验

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                getValueFormEvent: (e) =>
e.target.value.replace(/^\s+|\s$/g,'')
                initialValue: '',
            })(
                <Input id='phone' />
            )}
        </FormItem>
    </Col>

</Row>
// "  hello world  ".replace(/^\s+|\s+$/g, ""); // 输出 "hello world"‌:ml-
citation{ref="1,3" data="citationList"}
语法 含义 示例匹配场景
^\s+ 匹配字符串‌开头 的1个或多个空白字符(空格、制表符、换行符等)‌‌ " hello" 中的开头空格
\s+$ 匹配字符串‌末尾 的1个或多个空白字符‌ "world " 中的末尾空格
| 逻辑“或”操作符,匹配两者之一‌ 同时处理开头和末尾空格
g 全局匹配模式,替换所有符合条件的内容(而非仅第一个)‌ 多次替换
  • \s
    匹配‌单个空白字符 ,包括:
  • 空格(
  • 制表符(\t
  • 换行符(\n
  • 换页符(\f)等‌。
    注:\S 表示其反向匹配(非空白字符)‌。
  • ^$
  • ^ 匹配字符串的‌起始位置 (需在开头)‌。
  • $ 匹配字符串的‌结束位置 (需在末尾)‌。
  • +
    表示前面的字符(\s)‌至少出现1次 (等价于 {1,})‌

若需‌严格匹配纯空格 (不含制表符等),可用 [ ]+ 替代 \s+

在拆分字符串时,\s 常用于分割单词(如 split(/\s+/)

正则表达式 作用 区别
/\s+/g 匹配‌所有连续空白字符 不限定位置,包括中间空格‌3
/^\s+/g 仅匹配‌开头空白字符 忽略末尾空格‌3
/\s+$/g 仅匹配‌末尾空白字符 忽略开头空格‌

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12718.html

(0)
LomuLomu
上一篇 2025 年 7 月 3 日
下一篇 2025 年 7 月 3 日

相关推荐

  • CLion破解版兼容性如何?可用于旧设备吗?

    声明:本文所涉及的 CLion 破解补丁与激活码均源自网络公开渠道,仅供个人学习研究之用,严禁商业用途。若条件允许,请支持正版! 先放一张“战果”——CLion 2025.2.1 已顺利激活至 2099 年,爽歪歪! 下面用图文方式手把手演示最新版 CLion 的完整激活流程。 前期准备 若你曾尝试过其他补丁却失败,建议先卸载旧版本并重新安装,或手动清理残留…

    2025 年 9 月 18 日
    29500
  • MySQL 面试题

    MySQL 中有哪几种锁? 全局锁、行级锁、自增锁、记录锁、外键锁、间隙锁、表级锁、元数据锁、意向锁、临键锁 MySQL 中有哪些不同的表格? 基础表、临时表、系统表、信息表、性能模式表、分区表、外键表、触发器使用的表、存储过程和函数使用的表 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别? 事务支持 InnoDB:支持事务处理,具有提…

    未分类 2025 年 1 月 10 日
    42400
  • 一款基于 Vue + SpringBoot 前后端分离的开源博客系统!

    大家好,我是Java陈序员。 今天,我要向大家展示一款采用Vue和SpringBoot技术栈构建的开源博客系统——拾壹博客! 项目概览 拾壹博客(shiyi-blog)是一款现代化的博客系统,实现了前后端分离架构。它支持本地文件存储以及七牛云存储,同时集成了QQ、微信等第三方登录,并具备即时通讯聊天室的功能。 功能亮点: 采用前后端分离架构,运用前沿技术打造…

    2024 年 12 月 24 日
    60300
  • 2025年最新PyCharm激活码及永久破解教程(支持2099年)

    前言 本教程适用于JetBrains全家桶软件,包括PyCharm、IDEA、DataGrip、Goland等开发工具。先展示最新PyCharm版本成功破解到2099年的效果图,证明方法真实有效! 无论您使用的是Windows、Mac还是Linux系统,无论是什么版本,本教程都能100%成功激活! 第一步:获取PyCharm安装包 已安装用户可跳过此步骤 访…

    PyCharm激活码 2025 年 9 月 4 日
    34600
  • 永久IDEA破解合集2025含永久IDEA激活码文件

    本教程适用于IDEA、PyCharm、DataGrip、Goland等,支持Jetbrains全家桶! 废话不多说,先上最新 IDEA 版本破解成功的截图,如下,可以看到已经成功破解到 2099 年辣,舒服! 接下来,我就将通过图文的方式, 来详细讲解如何激活 IDEA至 2099 年。 当然这个激活方法,同样适用于之前的旧版本! 不管你是什么操作系统,什么…

    IDEA破解教程 2025 年 12 月 22 日
    22800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信