html5 pattern属性可实现无js的密码强度基础校验,如长度、字母数字混合等,配合required和title提升体验,但需注意safari等浏览器对正向先行断言兼容性差,复杂规则应交由js处理。

直接用 HTML5 的 pattern 属性配合 title 和浏览器原生验证机制,就能实现注册页中密码强度的**基础判定**——不依赖 JS、不写正则引擎、不调第三方库,但能拦住明显不合格的输入,比如太短、全数字、纯字母等。
用 pattern 定义可校验的最小结构
pattern 本质是让浏览器对输入值执行一次 RegExp.test()。它适合表达「必须满足的整体格式」,不是做语义分析,但足够应付上线前的基础把关:
- 长度底线:
pattern=".{8,}"(至少 8 个任意字符) - 禁止纯数字:
pattern="(?=.*[a-zA-Z]).{8,}"(必须含至少一个英文字母) - 宽松混合要求:
pattern="(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}"(大小写字母 + 数字,≥8 位) - 兼容空格的写法:
pattern="(?=.*[a-zA-Z])(?=.*\d)[\s\S]{8,}"(允许空格、换行、中文等)
搭配 required 和 title 提升可用性
单独 pattern 不会自动触发提示,需和其它属性协同:
-
required确保非空 -
title提供用户可见的提示文案,如title="需含大小写字母和数字,至少8位" - 浏览器在提交时校验失败,会聚焦该字段并弹出含 title 内容的气泡提示
保留 fallback,防 JS 被禁用
pattern 是无 JS 环境下的兜底保障。哪怕用户关了 JavaScript,只要表单用 <form></form> 提交,浏览器仍会执行 pattern 校验。所以建议始终保留它,哪怕后续用 JS 做更细反馈:
- HTML 中写:
<input type="password" id="pwd" pattern=".{8,}" title="密码至少8位"> - JS 中再增强:监听
input事件做实时分项检测,用setCustomValidity()覆盖默认提示 - 这样既保底线,又不牺牲体验
注意 Safari 和旧版浏览器的兼容边界
正向先行断言((?=.*\d) 这类)在 Safari 15.4 之前支持不稳定,部分 Android WebView 也会跳过。稳妥做法是:
- 基础结构用简单 pattern,如
pattern=".{8,}"或pattern="[^\s]{8,}"(非空白字符) - 复杂规则交给 JS 实现,pattern 只做“长度+非空格”这类高兼容性约束
- 避免在 pattern 中使用
\p{L}、Unicode 属性类等新特性











