Layui 的 lay-verify 不支持直接写正则表达式,必须通过 form.verify() 注册自定义函数,在函数内用正则显式校验并处理空值、换行及中文标点兼容;富文本和表格编辑需分别调用 layedit.sync() 和 table.on('edit') 拦截验证。

textarea 的 lay-verify 不能直接写正则表达式
因为 lay-verify 属性只接受内置规则名(如 required、email)或你注册过的自定义函数名,不支持直接写 /^[\u4e00-\u9fa5a-zA-Z0-9]{1,200}$/ 这类正则字面量——Layui 会把它当普通字符串处理,.test() 根本不会执行。
常见错误是复制网上代码,在 HTML 里这么写:<textarea lay-verify="required|/^[\u4e00-\u9fa5a-zA-Z0-9]+$/>,结果正则完全不生效,只有 required 起作用。
- 必须把正则逻辑封装进
form.verify()定义的函数里,例如content - 函数内用
/^[\u4e00-\u9fa5a-zA-Z0-9\u3000-\u303f\uff00-\uffef]*$/.test(value)显式校验 - 别忘了先做空值判断:
if (!value || !value.trim()) return '内容不能为空';,否则.test()对null报错 - 若允许换行,正则中要显式包含
\n或使用[\s\S];但注意\s在 JS 中不匹配全角空格,得补上\u3000
中文+标点+空格的正则怎么写才稳妥
直接套用 /[\u4e00-\u9fa5]/ 只能匹配汉字,漏掉用户常输的中文顿号、引号、全角空格、emoji 等,粘贴过来就校验失败。更实用的覆盖范围是:
/^[\u4e00-\u9fa5a-zA-Z0-9_\u3000-\u303f\uff00-\uffef\u2018-\u2019\u201c-\u201d\n\r\t]*$/
-
\u3000-\u303f:中文全角空格、顿号、逗号、句号等基本标点 -
\uff00-\uffef:全角 ASCII 字符(如ABC、123) -
\u2018-\u201d:中文左右单双引号(‘’“”),避免用户输了引号却被拦 - 结尾用
*(非+),允许空内容(配合required单独控制必填) - 如果业务明确禁止换行,去掉
\n\r\t;若需限制总长度,校验后额外加value.length <= 500
富文本编辑器里的 textarea 怎么同步验证
Layui 的 layedit 是独立渲染层,用户输入内容不在 textarea DOM 值里,直接对 textarea.value 正则校验永远为空。
- 必须在自定义验证函数里第一行调用
layedit.sync(index)同步内容,index是layedit.build()返回的数字 ID - 同步后才能取到真实值:
const content = $('#myEditor').val(); - 再对
content执行正则:if (!/^[\u4e00-\u9fa5]{10,}/.test(content)) return '正文至少10个汉字'; - 不要在
lay-verify里写required+ 自定义规则组合(如required|content),因为required检查的是原始textarea值(仍为空),会提前报错 - 推荐只写
lay-verify="content",把非空和格式校验全收进函数里
表格单元格内编辑的 textarea 如何验证
表格的 edit: "textarea" 是 Layui 封装的快捷方式,它生成的 input 不暴露原生事件,lay-verify 绑定无效,必须走 table.on('edit()') 事件拦截。
- 在
table.on('edit(test)', function(obj){...})回调里,第一行写e.preventDefault() - 用
e.value获取新输入值(注意不是e.data.field,那是旧值) - 执行正则:
if (!/^[\u4e00-\u9fa5a-zA-Z0-9\u3000-\u303f]*$/.test(e.value.trim())) { ... } - 校验失败时,手动恢复单元格显示:
e.tr.find(`td[data-field="${e.field}"]`).html(e.oldValue) - 验证通过后,必须调用
table.updateCell(e.id, e.field, e.value.trim()),否则数据源不同步
多字段共用一套规则?别重复写,用对象映射:const rules = { remark: /[\u4e00-\u9fa5a-zA-Z0-9\u3000-\u303f]*/, desc: /^.{1,200}$/ };,然后 if (!rules[e.field].test(e.value)) ...。


















