layui数据验证规则:内置规则与正则表达式
还在为表单验证而烦恼?layui提供了强大而灵活的数据验证机制,从内置规则到自定义正则表达式,一站式解决你的表单验证需求!
开篇痛点:为什么需要表单验证?
在日常Web开发中,表单验证是不可或缺的重要环节。传统的手动验证代码冗长、维护困难,而layui的表单验证机制通过简洁的配置方式,让开发者能够快速实现各种复杂的验证需求。
通过本文,你将掌握:
- ✅ layui内置的7种验证规则及其正则表达式原理
- ✅ 如何组合使用多个验证规则
- ✅ 自定义验证规则的完整实现方法
- ✅ 正则表达式在验证中的高级应用技巧
- ✅ 实战案例:用户注册表单的完整验证方案
layui验证机制核心原理
layui的表单验证基于lay-verify属性,通过在表单元素上设置该属性来指定验证规则。验证过程在表单提交时自动触发,支持同步和异步验证。
内置验证规则详解
layui提供了7种常用的内置验证规则,每种规则都对应着精心设计的正则表达式。
1. required - 必填项验证
使用场景:确保用户必须填写某些重要字段
<input type="text" name="username" lay-verify="required" placeholder="请输入用户名">
正则表达式原理:
/[\S]+/.test(value) // 匹配至少一个非空白字符
注意事项:
- 从2.8.3版本开始,
required不再强制其他规则必填 - 如需必填+格式验证,需使用组合规则:
lay-verify="required|email"
2. phone - 手机号验证
使用场景:验证手机号码格式
<input type="tel" name="mobile" lay-verify="phone" placeholder="请输入手机号">
正则表达式:
/^1\d{10}$/ // 以1开头,后面跟10位数字
验证逻辑:
- 空值不验证(非必填)
- 有值时必须符合手机号格式
- 支持所有运营商号段
3. email - 邮箱验证
使用场景:验证电子邮箱地址格式
<input type="email" name="email" lay-verify="email" placeholder="请输入邮箱">
正则表达式:
/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
格式要求:
- 用户名部分:字母、数字、下划线、点、连字符
- 域名部分:至少两级域名
- 顶级域名:2-4个字母
4. url - 网址验证
使用场景:验证URL链接格式
<input type="url" name="website" lay-verify="url" placeholder="请输入网址">
正则表达式:
/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/
支持格式:
- 完整URL:
http://、https://、// - 锚点链接:
# - 相对路径:
/path/to/page
5. number - 数字验证
使用场景:验证输入是否为有效数字
<input type="text" name="age" lay-verify="number" placeholder="请输入年龄">
验证逻辑:
if (value && isNaN(value)) {
return '只能填写数字';
}
特点:
- 支持整数和小数
- 空值不验证
- 使用JavaScript内置的
isNaN函数
6. date - 日期验证
使用场景:验证日期格式
<input type="text" name="birthday" lay-verify="date" placeholder="请输入日期">
正则表达式:
/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/
支持格式:
YYYY-MM-DDYYYY/MM/DDYYYY-MMYYYY
7. identity - 证件验证
使用场景:验证证件号码
<input type="text" name="idcard" lay-verify="identity" placeholder="请输入证件号">
正则表达式:
/(^\d{15}$)|(^\d{17}(x|X|\d)$)/
验证规则:
- 15位数字:早期证件格式
- 18位数字:标准证件格式(最后一位可能是X)
内置验证规则对比表
| 规则名称 | 必填性 | 正则表达式 | 适用场景 | 示例 |
|---|---|---|---|---|
| required | 强制必填 | /[\S]+/ | 重要信息字段 | 用户名、密码 |
| phone | 非必填 | /^1\d{10}$/ | 手机号码 | 13800138000 |
| 非必填 | 复杂邮箱正则 | 电子邮箱 | test@example.com | |
| url | 非必填 | URL正则 | 网址链接 | https://example.com |
| number | 非必填 | isNaN检测 | 数字字段 | 年龄、数量 |
| date | 非必填 | 日期格式正则 | 日期字段 | 2023-12-01 |
| identity | 非必填 | 证件正则 | 身份认证 | 证件号码 |
组合使用验证规则
layui支持通过|符号组合多个验证规则,实现复杂的验证需求。
基本组合语法
<!-- 必填+邮箱验证 -->
<input type="email" lay-verify="required|email">
<!-- 必填+手机号验证 -->
<input type="tel" lay-verify="required|phone">
<!-- 必填+数字验证 -->
<input type="text" lay-verify="required|number">
执行顺序说明
自定义验证规则实战
除了内置规则,layui允许开发者自定义验证规则,这是其最强大的功能之一。
自定义规则基本结构
form.verify({
规则名称: function(value, elem) {
// 验证逻辑
if (验证失败) {
return '错误提示信息';
}
}
});
实战案例:用户名校验
form.verify({
username: function(value, elem) {
// 不能有特殊字符(除中文、英文、数字、下划线、空格、中间点)
if (!/^[a-zA-Z0-9_\u4e00-\u9fa5\s·]+$/.test(value)) {
return '用户名不能有特殊字符';
}
// 首尾不能出现下划线
if (/(^_)|(__)|(_+$)/.test(value)) {
return '用户名首尾不能出现下划线';
}
// 不能全为数字
if (/^\d+$/.test(value)) {
return '用户名不能全为数字';
}
}
});
实战案例:密码强度验证
form.verify({
password: function(value, elem) {
// 长度验证
if (!/^[\S]{6,16}$/.test(value)) {
return '密码必须为6到16位的非空字符';
}
// 强度验证(可选)
if (!/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(value)) {
return '密码必须包含大小写字母和数字';
}
}
});
非必填项的自定义验证
form.verify({
motto: function(value, elem) {
if (!value) return; // 空值不验证(非必填)
// 有值时的验证逻辑
if (value.length < 10) {
return '座右铭至少需要10个字符';
}
}
});
高级正则表达式技巧
1. 密码复杂度验证
// 必须包含大小写字母和数字,8-20位
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,20}$/
// 必须包含字母、数字、特殊字符,8-20位
/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*])[a-zA-Z\d!@#$%^&*]{8,20}$/
2. 姓名验证
// 2-4个中文字符
/^[\u4e00-\u9fa5]{2,4}$/
// 支持姓名中的点
/^[\u4e00-\u9fa5·]{2,10}$/
3. 银行卡号验证(Luhn算法)
function validateBankCard(cardNo) {
if (!/^\d{16,19}$/.test(cardNo)) return false;
let sum = 0;
let isEven = false;
for (let i = cardNo.length - 1; i >= 0; i--) {
let digit = parseInt(cardNo.charAt(i));
if (isEven) {
digit *= 2;
if (digit > 9) digit -= 9;
}
sum += digit;
isEven = !isEven;
}
return sum % 10 === 0;
}
完整实战:用户注册表单验证
下面是一个完整的用户注册表单验证示例:
<form class="layui-form" lay-filter="register-form">
<div class="layui-form-item">
<label class="layui-form-label">用户名</label>
<div class="layui-input-block">
<input type="text" name="username" lay-verify="required|username"
placeholder="4-20位字符,支持中文、英文、数字" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-block">
<input type="password" name="password" lay-verify="required|password"
placeholder="6-16位字符,包含大小写字母和数字" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机号</label>
<div class="layui-input-block">
<input type="tel" name="mobile" lay-verify="required|phone"
placeholder="请输入手机号" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">
<input type="email" name="email" lay-verify="email"
placeholder="选填" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="register-submit">注册</button>
</div>
</div>
</form>
<script>
layui.use(['form'], function(){
var form = layui.form;
// 自定义验证规则
form.verify({
username: function(value) {
if (!/^[a-zA-Z0-9_\u4e00-\u9fa5]{4,20}$/.test(value)) {
return '用户名必须为4-20位中文、英文、数字或下划线';
}
if (/^\d+$/.test(value)) {
return '用户名不能全为数字';
}
},
password: function(value) {
if (!/^[\S]{6,16}$/.test(value)) {
return '密码必须为6-16位的非空字符';
}
if (!/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(value)) {
return '密码必须包含大小写字母和数字';
}
}
});
// 提交事件
form.on('Submit(register-submit)', function(data){
console.log('验证通过,提交数据:', data.field);
// 这里可以执行AJAX提交
return false; // 阻止表单跳转
});
});
</script>
验证提示样式配置
layui支持三种验证提示方式,通过lay-vertype属性配置:
<!-- 默认提示(吸附层) -->
<input lay-verify="required" lay-vertype="tips">
<!-- 对话框提示 -->
<input lay-verify="required" lay-vertype="alert">
<!-- 消息提示 -->
<input lay-verify="required" lay-vertype="msg">
自定义必填项提示文本
<input lay-verify="required" lay-reqtext="这个字段必须要填写哦!">
常见问题与解决方案
1. 验证规则不生效怎么办?
排查步骤:
- 检查是否正确引入了layui.js
- 确认表单元素有
class="layui-form" - 检查
lay-verify属性值是否正确 - 查看浏览器控制台是否有错误信息
2. 如何实现异步验证?
form.verify({
asyncCheck: function(value, elem) {
var deferred = $.Deferred();
// 模拟异步请求
setTimeout(function() {
if (value === 'admin') {
deferred.reject('用户名已存在');
} else {
deferred.resolve();
}
}, 1000);
return deferred.promise();
}
});
3. 如何手动触发验证?
// 验证单个表单
var isValid = form.validate('#username-input');
// 验证整个表单
var isValid = form.validate('register-form');
性能优化建议
- 避免过度验证:只在必要的字段上设置验证规则
- 合理使用组合规则:按实际需求组合,避免不必要的验证
- 异步验证优化:对于耗时的验证(如用户名查重),使用防抖处理
- 正则表达式优化:使用高效的正则模式,避免回溯灾难
总结
layui的数据验证机制提供了从简单到复杂的完整解决方案:
- 🎯 内置规则:覆盖常见验证场景,开箱即用
- 🛠️ 自定义规则:灵活扩展,满足个性化需求
- 🔧 正则支持:强大的正则表达式引擎,处理复杂逻辑
- ⚡ 组合使用:多重验证规则协同工作
- 🎨 样式定制:多种提示方式,提升用户体验
通过合理运用layui的验证功能,可以显著提升开发效率,减少重复代码,同时确保数据的准确性和完整性。无论是简单的必填验证,还是复杂的业务逻辑校验,layui都能提供优雅的解决方案。
实践建议:在实际项目中,建议将常用的自定义验证规则封装成独立的模块,便于复用和维护。同时,对于复杂的业务验证逻辑,可以考虑结合后端验证,实现前后端一致的数据校验。
延伸阅读:想要了解更多layui高级用法?推荐继续学习《layui表单高级技巧:动态验证与条件验证》和《layui组件化开发实战》等专题文章。
点赞、收藏、关注三连,获取更多前端开发干货!下期预告:《layui表格组件深度解析:从基础使用到高级定制》
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



