在form.verify中添加自定义正则规则需以键值对形式定义,键为规则名,值为接收value和item的函数,必须显式return错误提示字符串才能触发校验失败提示,推荐用new RegExp构造正则,避免g标志,并注意绑定时机与DOM状态一致。

form.verify 里怎么加自定义正则规则
直接在 form.verify 对象里加键值对,键是规则名(比如 mobile),值是函数,函数接收两个参数:当前字段的值和原始 DOM 元素。返回 false 或字符串表示校验失败,返回 undefined 或 true 表示通过。
注意:这个函数里不能直接用 return /xxx/.test(value) 就完事——你得自己写逻辑判断并返回错误提示,否则表单提交时不会显示错误信息,甚至可能静默失败。
- 函数必须显式
return错误提示字符串(如"手机号格式不正确")才触发红框+提示 - 如果只做布尔判断但没
return字符串,Layui 会认为“验证通过” - 正则建议用
new RegExp()构造,方便动态拼接或复用
手机号、身份证号等常见正则怎么写进 verify
别硬背,按场景抄现成能跑的就行。比如手机号验证,国内常用的是 11 位、以 1 开头、第二位是 3–9:
form.verify({
mobile: function(value, item){
if(!/^1[3-9]d{9}$/.test(value)){
return '请输入正确的手机号';
}
},
idcard: function(value, item){
// 简化版:15 或 18 位数字,18 位末位可为 X
if(!/^d{15}(d{2}[dxX])?$/.test(value)){
return '身份证号格式不正确';
}
}
});
注意:Layui 不校验身份证最后一位校验码,真要严格验证得另写逻辑;15 位身份证已基本淘汰,生产环境建议只放开 18 位 + 大小写 X。
-
item是 DOM 元素,可用于取item.name做多字段联动判断(比如“确认密码”需比对“密码”字段) - 正则中不要用
g标志,test()在全局模式下会因 lastIndex 导致偶发失效 - 中文括号、全角字符容易被忽略,表单输入时最好加
oninput="this.value=this.value.replace(/[^0-9]/g,'')"做前置过滤
多个字段共用同一套正则,怎么避免重复写
把正则逻辑抽成独立函数,再在 form.verify 里引用,既减少重复又便于统一维护:
var isMobile = function(v) {
return /^1[3-9]d{9}$/.test(v);
};
form.verify({
mobile: function(value){
if(!isMobile(value)) return '手机号格式不对';
},
contact: function(value){
if(!isMobile(value) && !/^0d{2,3}-?d{7,8}$/.test(value)) {
return '请填手机号或固话';
}
}
});
这样改手机号规则时,只动 isMobile 一个地方。但如果不同字段对空值处理不一致(比如“手机号必填”,“联系电话可为空”),就不能完全复用,得在各自验证函数里加 if(!value) return 判断。
- 别把正则直接赋给变量再
test——/xxx/.test比reg.test更快且无状态问题 - 如果正则要动态适配地区(如带国际区号),用
new RegExp('^\+' + code + '\d{10,15}$'),注意双反斜杠转义
验证规则不生效?常见掉坑点
最常遇到的是:写了 form.verify,但表单提交时毫无反应,或者点了提交才弹错,但光标没定位到对应输入框。根本原因通常是绑定时机或选择器问题。
- 确保
form.verify在form.render()之前执行,否则新规则不会注入到验证系统中 - 检查 input 的
lay-verify属性是否拼错,比如写成lay-verfify或漏了引号:lay-verify="mobile"(必须是字符串) - 如果字段是异步加载(如 Tab 页切换后插入的表单),需要手动调用
form.verify()触发重绑,或用form.on('submit(...)', ...)手动校验 - Layui 默认只对
type="text"、type="password"等原生类型生效,自定义组件(如日期选择器、下拉树)需在change事件里主动触发form.validate()
真正麻烦的不是写正则,而是规则和 DOM、生命周期、用户输入节奏之间的耦合。哪怕正则完全正确,只要绑定晚了半拍,就等于没写。











