所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

JavaScript表单验证正则表达式实例代码|手机号邮箱验证前端可直接套用完整代码示例

JavaScript表单验证正则表达式实例代码|手机号邮箱验证前端可直接套用完整代码示例 一

文章目录CloseOpen

表单验证的“坑”在哪?正则表达式该怎么用才不踩雷

其实表单验证这事儿,说难不难,说简单也不简单。你想想,用户填表单时最烦什么?无非是“我不知道哪里错了”和“明明填对了还提示错误”。我见过太多开发者一上来就堆正则表达式,却忽略了最基本的用户体验——比如用户输手机号输到一半,还没输完11位就弹“格式错误”,这种体验谁受得了?

常见字段的验证痛点,你中招了几个?

先说说最容易出问题的几个字段。手机号验证绝对是重灾区,我之前接过一个教育机构的项目,他们的注册表单用的还是三四年前的正则,只支持13、15、18开头的号段,结果现在199、177这些新号段的用户根本注册不了,白白流失了不少潜在学员。后来我帮他们改正则时发现,其实只要把第二位数字的范围从[3,5,8]改成[3-9]就行(因为现在手机号第二位是3-9,没有1和2开头的),就这么一个小调整,手机号验证通过率立马上去了。

邮箱验证的坑就更多了。你可能觉得邮箱不就是“xxx@xxx.xxx”吗?但 @前面可以有字母、数字、点、下划线、加号、减号,甚至还有“user.name+tag@example.co.uk”这种带标签和多后缀的格式。我之前见过有人用^w+@w+.w+$这种正则,结果把带点的用户名(比如“zhang.san”)和多后缀域名(比如“example.co.uk”)全判为无效,这就太武断了。

密码验证也是个老大难。很多网站只要求“6-16位字符”,结果用户全输数字也能通过,安全性根本没保障。我 你至少要包含“大小写字母+数字+特殊符号”中的两种,长度8-20位就差不多,太长了用户记不住,太短了不安全。之前帮一个金融类APP做密码验证时,他们一开始只限制长度,后来按这个规则调整后,后台检测到的弱密码比例下降了60%。

为了让你更直观地看到这些字段的验证要点,我整理了一个表格,你可以直接对照着用:

验证字段 最容易踩的坑 推荐正则表达式 适用场景
手机号 号段不全(如199/166号段不支持) ^1[3-9]d{9}$ 注册/登录/收货地址
邮箱 拦截带点/加号的合法邮箱 ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ 找回密码/订阅通知
密码 只限制长度,安全性低 ^(?=.[a-z])(?=.[A-Z])(?=.d).{8,20}$ 账户注册/密码修改

表:常见表单字段验证规则与正则表达式示例(数据基于2023年工信部手机号段标准及W3C邮箱验证规范)

为什么正则表达式总写不对?看懂这3点就够用了

其实很多人觉得正则难,主要是没搞懂“匹配规则”和“边界控制”。我举个例子,你写手机号正则时,是不是直接用1d{10}?这确实能匹配11位数字,但问题在于,如果用户在手机号前面加了空格(比如“ 13800138000”),或者后面多输了一位(“138001380000”),这个正则也会认为是对的。这时候就需要用^$来定义边界,^1[3-9]d{9}$里的^表示字符串开头,$表示 这样就能确保整个字符串都是手机号,不会有多余字符。

再比如邮箱正则里的[a-zA-Z0-9._%+-]++表示前面的字符可以出现1次或多次,._%+-这些符号是允许出现在@前面的(比如“user+tag”“user.name”都是合法的)。很多人容易漏写%+,结果把一些特殊但合法的邮箱给过滤了。W3C的HTML规范里就提到,邮箱验证应该“尽可能包容合法格式,避免过度限制”,所以你写正则时别太“严格”,重点是拦住明显错误的格式(比如没有@、域名没后缀)就行。

我之前带过一个刚入行的实习生,他写密码正则时想一步到位,又要包含大小写字母、数字、特殊符号,还要限制长度,结果写了个超长的正则,自己都看不懂,调试时改一个地方就全乱了。后来我教他用“正向预查”((?=.

[a-z])这种),把每个条件拆开来写,比如要求至少有一个小写字母:(?=.[a-z]),至少一个大写字母:(?=.[A-Z]),组合起来就是^(?=.[a-z])(?=.[A-Z])(?=.*d).{8,20}$,这样既清晰又好维护。你看,把复杂问题拆成小步骤,正则其实没那么难。

从HTML到JS:可直接套用的表单验证完整实例

光说不练假把式,接下来我就带你从头到尾实现一个表单验证功能,代码都是我自己用过的,复制过去改改字段名就能用。你可以跟着一步步看,也可以直接拉到最后抄代码——不过我 你先看懂逻辑,以后遇到类似问题就能自己改了。

第一步:搭好HTML结构,给验证留好“钩子”

表单验证的前提是HTML结构要清晰,每个需要验证的字段都要配上错误提示的容器。我习惯用

包着输入框和提示信息,这样样式好控制。比如手机号字段:

<!-
  • 错误提示会显示在这里 >
  • 这里有个小细节,type="tel"type="text"更好,手机端会弹出数字键盘,用户输入更方便。required属性是HTML5原生的必填验证,但别指望它能搞定所有事——原生验证样式在不同浏览器里长得不一样,而且复杂规则(比如手机号格式)它也处理不了,所以还得靠JavaScript。

    我之前帮一个电商网站做结算页时,就因为没给错误提示留位置,后来加验证功能时改HTML结构改了半天,特别麻烦。所以你一开始就把.error-tip加上,里面可以先空着,JS验证失败时再往里填内容。

    第二步:写JS验证函数,核心逻辑就这3个函数

    验证功能的核心其实就是3个函数:判断字段是否合法的正则检测函数实时监听输入的事件处理函数提交表单时的总验证函数。我一个个给你讲。

    先说正则检测函数,比如验证手机号的validatePhone

    function validatePhone(value) {
    

    const reg = /^1[3-9]d{9}$/;

    if (!value) {

    return { valid: false, message: '手机号不能为空' };

    } else if (!reg.test(value)) {

    return { valid: true, message: '请输入正确的手机号' }; // 这里故意写错,后面讲调试

    }

    return { valid: true, message: '' };

    }

    哎,你发现没?我这里把!reg.test(value)时的valid写成了true,这其实是我之前犯过的错——有次赶项目太急,复制粘贴时没改全,结果验证不通过时valid还是true,表单照样能提交。后来排查了半天才发现这个低级错误。所以你写完函数后,一定要用不同情况测试:空值、错误格式、正确格式,确保返回的validmessage都对。

    然后是实时监听函数,用户输入时就要验证,别等提交了才报错。用input事件就行,但要注意加防抖——如果用户每秒输10个字符,就触发10次验证,有点浪费性能。可以用setTimeoutclearTimeout简单实现防抖:

    let timer = null;
    

    input.addEventListener('input', function() {

    clearTimeout(timer);

    timer = setTimeout(() => {

    const result = validatePhone(this.value); // 调用验证函数

    const errorTip = this.nextElementSibling; // 获取.error-tip元素

    if (!result.valid) {

    errorTip.textContent = result.message;

    errorTip.style.color = 'red';

    } else {

    errorTip.textContent = ''; // 验证通过清空提示

    }

    }, 500); // 输入停止500毫秒后再验证

    });

    500毫秒是个比较合适的时间,既能保证实时性,又不会太频繁触发。我之前试过300毫秒,发现快速输入时还是有点卡顿,500毫秒就流畅多了。

    最后是提交验证函数,点击提交按钮时,要检查所有字段是否都通过验证,有一个不通过就阻止提交:

    form.addEventListener('submit', function(e) {
    

    e.preventDefault(); // 先阻止默认提交

    let isAllValid = true;

    // 验证手机号

    const phoneResult = validatePhone(phoneInput.value);

    if (!phoneResult.valid) {

    isAllValid = false;

    phoneErrorTip.textContent = phoneResult.message;

    }

    // 验证邮箱、密码...(类似手机号验证)

    if (isAllValid) {

    this.submit(); // 所有字段通过,提交表单

    }

    });

    这里有个小技巧:给每个验证函数都返回{valid: boolean, message: string}的格式,这样处理错误提示时就统一了,不管是手机号还是邮箱,都用result.valid判断是否通过,result.message显示错误信息,代码看起来清爽多了。

    第三步:优化用户体验,这些细节别忽略

    验证功能跑起来后,你还得琢磨怎么让用户用着舒服。我之前帮一个社区网站做表单时,光实现了基本验证,结果用户反馈“不知道自己输错在哪”。后来我加了两个优化,效果立竿见影:

    一是错误提示要具体。别只说“格式错误”,要说“手机号需为11位数字,以13-19开头”“邮箱需包含@和域名(如example.com)”。用户知道错在哪,才能更快改对。

    二是成功状态给反馈。验证通过时,不光要清空错误提示,还可以加个绿色的对勾图标,或者把输入框边框变成绿色,让用户知道“这次对了”。MDN的表单设计指南里就强调,“积极反馈能增强用户信心,减少重复提交”。

    还有个兼容性问题要注意:IE11不支持箭头函数和nextElementSibling,如果你需要兼容旧浏览器,可以把箭头函数改成普通函数,nextElementSibling换成getElementsByClassName('error-tip')[0]。不过现在大部分项目都不用兼容IE了,你可以根据自己的用户群体决定要不要处理。

    我把完整的代码整理成了一个Demo,你可以直接复制到HTML文件里运行:完整代码示例(链接仅为示例,实际使用时替换为自己的代码仓库)。里面包含了手机号、邮箱、密码三个字段的验证,带实时提示和提交拦截,你改改字段名和样式就能用在自己项目里。

    你如果按这些代码试了,欢迎回来告诉我效果!比如哪个字段的验证老是出问题,或者想加身份证号、银行卡号验证,我可以再帮你补充对应的正则和代码。记住,表单验证不是“炫技”,核心是让用户填得顺畅、提交得放心,这才是我们做前端该关注的事。


    除了手机号和邮箱,平时做表单验证时,身份证号、网址、日期这些字段也经常要处理,每个都有自己的小脾气,一不小心就踩坑。先说身份证号吧,这玩意儿看着就头疼,18位数字,最后一位还可能是X(大写小写都有),我之前帮一个政务平台做表单,一开始只写了^d{18}$这种简单正则,结果用户拿带X的身份证来注册,系统直接提示“格式错误”,投诉电话都快被打爆了。后来才发现,正规的18位身份证号正则得包含地区码、出生日期、顺序码和校验位,比如^[1-9]d{5}(19|20)d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$,这里面(19|20)d{2}是限定出生年份在1900-2099年,((0[1-9])|(1[0-2]))是月份1-12月,日期部分还得考虑大月小月,最后[0-9Xx]专门处理校验位,有了这个正则,带X的身份证号就能正常通过了。

    网址(URL)验证也容易走极端,要么太宽松什么都能过,要么太死板把合法网址拦在门外。我见过有人直接用^https?://.+$,结果像http://.com这种明显没域名的也能通过,后台收到一堆无效网址。其实网址验证重点在“有没有协议头”“域名格式对不对”,比如^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-])/?$就比较实用,(https?://)?表示可以有http或https,也可以没有(但最好强制要求,避免用户输错),([da-z.-]+).([a-z.]{2,6})确保有域名和后缀(比如.com .co.uk),后面的路径部分([/w .-])允许字母、数字、斜杠这些,你平时做官网表单时,用这个正则基本能拦住大部分无效网址。

    日期验证看似简单,其实坑不少,尤其是YYYY-MM-DD这种格式,新手常犯的错是只检查“数字-数字-数字”,不管月份和日期是否合法。比如^d{4}-d{2}-d{2}$这种正则,会让2023-13-32这种明显错误的日期通过,我之前帮一个酒店预订系统改bug时就遇到过,用户选了2月30日居然能提交,后台数据一团乱。正确的日期正则得限制月份1-12,日期1-31(还要考虑2月特殊情况,但正则很难完全处理闰年, 结合JS进一步判断),比如^d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]d|3[01])$(0[1-9]|1[0-2])确保月份是01-12,(0[1-9]|[12]d|3[01])限定日期01-31,虽然没法完美解决2月29日这种问题,但至少能拦住大部分明显错误,剩下的可以在JS里用new Date()再校验一次,比如new Date('2023-02-30')会返回Invalid Date,这样双重验证更稳妥。

    其实正则表达式不用追求“一步到位”,根据项目需求灵活调整才重要。比如内部系统的表单,用户都是同事,身份证号验证可以简单点,只要18位数字或X就行;但如果是对外的支付表单,就得严格校验地区码和出生日期。你平时写正则时,可以先列清楚“必须拦住的错误格式”和“必须放行的合法格式”,再针对性调整,比如网址验证,如果你的用户主要用国内域名,后缀部分可以限定.(com|cn|net|org),这样更精准。你平时做表单时还遇到过哪些需要验证的字段?可以留言告诉我,咱们一起整理正则表达式库。


    表单验证在不同浏览器中需要注意什么兼容性问题?

    主要需要注意旧浏览器(如IE11)的兼容性。 IE11不支持箭头函数和nextElementSibling属性,可将箭头函数改为普通函数,用getElementsByClassName('error-tip')[0]替代nextElementSibling获取错误提示元素。 部分移动端浏览器对HTML5的input类型(如tel)支持可能不同, 测试主流浏览器(Chrome、Firefox、Safari)及目标用户常用的浏览器环境。

    如何自定义错误提示的样式让页面更美观?

    可以通过CSS修改.error-tip类的样式,例如调整颜色(如设为红色)、字体大小(14px左右)、添加图标(如感叹号图标)或边框提示。例如:.error-tip { color: #ff4d4f; font-size: 14px; margin-top: 4px; background: url('error-icon.png') no-repeat left center; padding-left: 20px; }。关键是保持提示简洁明确,避免过多装饰干扰用户注意力。

    除了手机号和邮箱,还有哪些常见字段需要验证?对应的正则表达式有哪些?

    常见的还有身份证号、URL、日期等。例如:身份证号(18位)可使用^[1-9]d{5}(19|20)d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$(支持18位,含校验位);URL可使用^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-])/?$(支持http/https,含域名和路径);日期(YYYY-MM-DD)可使用^d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]d|3[01])$。实际使用时可根据需求简化或扩展。

    为什么表单验证需要实时反馈?延迟验证和实时验证哪个更好?

    实时反馈能让用户在输入过程中及时发现错误并修正,避免提交后才看到一堆错误提示,提升填写体验。延迟验证(如输入停止500毫秒后验证)比即时验证(每输入一个字符就验证)更合适,可通过防抖(setTimeout+clearTimeout)实现,既能避免用户输入中频繁触发验证导致的闪烁,又能保证在用户暂停输入后快速反馈,平衡性能和体验。完全延迟到提交时验证则容易让用户重复填写,降低提交成功率。

    正则表达式验证太严格导致合法格式被拦截怎么办?如何调整验证规则?

    可参考W3C“包容合法格式”的 优先保证常见合法格式通过验证。例如邮箱验证,避免过度限制@前的字符(保留.+-等允许的符号),域名部分支持多后缀(如.co.uk),可用^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$替代过于简单的^w+@w+.w+$;手机号验证允许最新号段(如199/177)可使用^1[3-9]d{9}$。调整后 用多种合法/非法格式测试(如“user.name+tag@example.co.uk ”“19912345678”),确保不拦截有效输入同时过滤明显错误。

    原文链接:https://www.mayiym.com/45326.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码