/** * 表单正则校验工具 * * 只导出纯正则常量与独立的校验函数,不做任何 antd/framework 耦合。 * 各页面的 Form.Item rules 应在对应页面目录的 controller.ts 中组装。 */ // ============================================================ // 正则常量 // ============================================================ /** * 中国大陆手机号 * - 11 位数字,第二位 3-9 */ export const CHINA_PHONE_REGEX = /^1[3-9]\d{9}$/; /** * 登录密码 * - 至少 8 位,同时包含字母与数字 * - 允许特殊字符 !@#$%^&*()_+-= */ export const LOGIN_PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d)[\w!@#$%^&*()_+\-=]{8,}$/; /** * 真实姓名(中文/英文/数字,1-8 位) */ export const REAL_NAME_REGEX = /^[\u4e00-\u9fa5A-Za-z0-9·]{1,8}$/; /** * 图片 MIME 类型前缀 * - 用于上传前校验文件是否为图片 */ export const IMAGE_TYPE_REGEX = /^image\//; /** * 纯数字(整数) * - 用于过滤非数字字符 */ export const INTEGER_ONLY_REGEX = /\D/g; // ============================================================ // 校验函数 // ============================================================ /** 校验中国大陆手机号 */ export function isChinaPhone(value: unknown): boolean { return typeof value === 'string' && CHINA_PHONE_REGEX.test(value); } /** 校验密码:至少 8 位 + 同时含字母与数字 */ export function isValidPassword(value: unknown): boolean { return typeof value === 'string' && LOGIN_PASSWORD_REGEX.test(value); } /** 校验真实姓名:1-8 个字符 */ export function isValidRealName(value: unknown): boolean { return typeof value === 'string' && value.length > 0 && REAL_NAME_REGEX.test(value); } /** 校验文件是否为图片类型 */ export function isImageFile(file: { type: string }): boolean { return IMAGE_TYPE_REGEX.test(file.type); } /** 过滤非数字字符,只保留整数 */ export function toIntegerOnly(value: unknown): string { return String(value ?? '').replace(INTEGER_ONLY_REGEX, ''); }