# 數(shù)據(jù)驗(yàn)證模塊
數(shù)據(jù)驗(yàn)證模塊提供了各種常用的數(shù)據(jù)驗(yàn)證功能,專為中文開發(fā)者優(yōu)化,支持手機(jī)號(hào)、身份證、郵箱等多種數(shù)據(jù)類型的驗(yàn)證。
## 引用方式
### ES6 模塊引用
```javascript
import sinma from 'sinmajs';
// 或者使用解構(gòu)賦值
import { isPhone, isEmail, isIdCard } from 'sinmajs';
```
### CommonJS 引用
```javascript
const sinma = require('sinmajs');
```
### 瀏覽器直接引用
```html
<script src="https://unpkg.com/sinmajs@latest/dist/sinma.min.js"></script>
<script>
// 直接使用 sinma 對(duì)象
console.log(sinma.isPhone('13812345678'));
</script>
```
## API 列表
### isPhone(value, strict) - 手機(jī)號(hào)驗(yàn)證
驗(yàn)證中國(guó)大陸手機(jī)號(hào)碼格式。
#### 參數(shù)
- `value` {string} - 待驗(yàn)證的手機(jī)號(hào)
- `strict` {boolean} - 是否啟用嚴(yán)格驗(yàn)證模式,默認(rèn) `false`
#### 返回值
- {boolean} - 驗(yàn)證通過返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
// 寬松驗(yàn)證:1開頭,第二位3-9,總長(zhǎng)11位
const phoneRegex = /^1[3-9]\d{9}$/;
// 嚴(yán)格驗(yàn)證:精確匹配運(yùn)營(yíng)商號(hào)段
const phoneStrictRegex = /^((13[0-3])|(13[5-9])|(14(0|[5-7]|9))|(15([0-3]|[5-9]))|(16(2|[5-7]))|(17[0-8])|(18[0-9])|(19([0-3]|[5-9])))\d{8}$/;
function isPhone(value, strict = false) {
if (typeof value !== 'string') return false;
return strict ? phoneStrictRegex.test(value) : phoneRegex.test(value);
}
```
#### 使用方法
```javascript
// 寬松驗(yàn)證
sinma.isPhone('13812345678'); // true
sinma.isPhone('12345678901'); // false
// 嚴(yán)格驗(yàn)證(精確號(hào)段匹配)
sinma.isPhone('13412345678', true); // false (134號(hào)段不支持)
sinma.isPhone('13512345678', true); // true
```
#### 使用范例
```javascript
// 表單驗(yàn)證示例
function validatePhoneInput(phone) {
if (!sinma.isPhone(phone)) {
return {
valid: false,
message: '請(qǐng)輸入正確的手機(jī)號(hào)碼'
};
}
if (!sinma.isPhone(phone, true)) {
return {
valid: false,
message: '該手機(jī)號(hào)碼號(hào)段暫不支持'
};
}
return {
valid: true,
message: '驗(yàn)證通過'
};
}
// 實(shí)際應(yīng)用
const result = validatePhoneInput('13812345678');
console.log(result); // { valid: true, message: '驗(yàn)證通過' }
```
---
### isEmail(value) - 郵箱驗(yàn)證
驗(yàn)證郵箱地址格式是否正確。
#### 參數(shù)
- `value` {string} - 待驗(yàn)證的郵箱地址
#### 返回值
- {boolean} - 驗(yàn)證通過返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
function isEmail(value) {
if (typeof value !== 'string') return false;
return emailRegex.test(value);
}
```
#### 使用方法
```javascript
sinma.isEmail('user@example.com'); // true
sinma.isEmail('test@domain.co.uk'); // true
sinma.isEmail('invalid-email'); // false
sinma.isEmail('user@'); // false
```
#### 使用范例
```javascript
// 郵箱格式驗(yàn)證示例
function validateEmail(email) {
if (!email) {
return '郵箱地址不能為空';
}
if (!sinma.isEmail(email)) {
return '請(qǐng)輸入正確的郵箱地址格式';
}
return null; // 驗(yàn)證通過
}
// 批量驗(yàn)證郵箱
const emails = ['user@test.com', 'invalid', 'admin@domain.org'];
const results = emails.map(email => ({
email,
valid: sinma.isEmail(email)
}));
console.log(results);
// [
// { email: 'user@test.com', valid: true },
// { email: 'invalid', valid: false },
// { email: 'admin@domain.org', valid: true }
// ]
```
---
### isIdCard(value, strict) - 身份證驗(yàn)證
驗(yàn)證中國(guó)大陸居民身份證號(hào)碼。
#### 參數(shù)
- `value` {string} - 待驗(yàn)證的身份證號(hào)
- `strict` {boolean} - 是否啟用嚴(yán)格驗(yàn)證模式,默認(rèn) `false`
#### 返回值
- {boolean} - 驗(yàn)證通過返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
const idCardRegex = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
function isIdCard(value, strict = false) {
if (typeof value !== 'string') return false;
if (!idCardRegex.test(value)) return false;
if (strict) {
return validateIdCard(value); // 嚴(yán)格驗(yàn)證包含校驗(yàn)位驗(yàn)證
}
return true;
}
```
#### 使用方法
```javascript
// 基礎(chǔ)格式驗(yàn)證
sinma.isIdCard('110101199003070134'); // true
sinma.isIdCard('440301199001011234'); // true
sinma.isIdCard('12345'); // false
// 嚴(yán)格驗(yàn)證(包含校驗(yàn)位、省份代碼、日期驗(yàn)證)
sinma.isIdCard('110101199003070134', true); // true
sinma.isIdCard('110101199003070133', true); // false(校驗(yàn)位錯(cuò)誤)
```
#### 使用范例
```javascript
// 用戶注冊(cè)身份證驗(yàn)證
function validateUserIdCard(idCard) {
if (!idCard) {
return { valid: false, error: '身份證號(hào)不能為空' };
}
if (!sinma.isIdCard(idCard)) {
return { valid: false, error: '身份證號(hào)格式不正確' };
}
if (!sinma.isIdCard(idCard, true)) {
return { valid: false, error: '身份證號(hào)校驗(yàn)失敗,請(qǐng)檢查輸入' };
}
// 提取身份證信息
const province = sinma.getProvinceByIdCard(idCard);
const birthday = sinma.getBirthDateByIdCard(idCard);
const gender = sinma.getGenderByIdCard(idCard);
return {
valid: true,
info: { province, birthday, gender }
};
}
const result = validateUserIdCard('110101199003070134');
console.log(result);
// {
// valid: true,
// info: {
// province: '北京',
// birthday: '1990-03-07',
// gender: '男'
// }
// }
```
---
### isEmpty(value) - 空值檢測(cè)
檢測(cè)值是否為空(null、undefined、空字符串、空數(shù)組、空對(duì)象)。
#### 參數(shù)
- `value` {*} - 待檢測(cè)的值
#### 返回值
- {boolean} - 為空返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
function isEmpty(value) {
if (value == null) return true;
if (typeof value === 'string') return value.trim() === '';
if (Array.isArray(value)) return value.length === 0;
if (typeof value === 'object') return Object.keys(value).length === 0;
return false;
}
```
#### 使用方法
```javascript
sinma.isEmpty(null); // true
sinma.isEmpty(undefined); // true
sinma.isEmpty(''); // true
sinma.isEmpty(' '); // true
sinma.isEmpty([]); // true
sinma.isEmpty({}); // true
sinma.isEmpty('hello'); // false
sinma.isEmpty([1, 2]); // false
sinma.isEmpty({a: 1}); // false
```
#### 使用范例
```javascript
// 表單數(shù)據(jù)驗(yàn)證
function validateFormData(formData) {
const errors = [];
if (sinma.isEmpty(formData.name)) {
errors.push('姓名不能為空');
}
if (sinma.isEmpty(formData.email)) {
errors.push('郵箱不能為空');
}
if (sinma.isEmpty(formData.tags)) {
errors.push('至少選擇一個(gè)標(biāo)簽');
}
return {
valid: errors.length === 0,
errors
};
}
// 過濾空值
const data = ['hello', '', null, 'world', undefined, 'test'];
const filtered = data.filter(item => !sinma.isEmpty(item));
console.log(filtered); // ['hello', 'world', 'test']
```
---
### isNumber(value) - 數(shù)字驗(yàn)證
判斷值是否為有效數(shù)字類型。
#### 參數(shù)
- `value` {*} - 待驗(yàn)證的值
#### 返回值
- {boolean} - 是有效數(shù)字返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
function isNumber(value) {
return typeof value === 'number' && !isNaN(value);
}
```
#### 使用方法
```javascript
sinma.isNumber(123); // true
sinma.isNumber(0); // true
sinma.isNumber(-123); // true
sinma.isNumber(3.14); // true
sinma.isNumber('123'); // false
sinma.isNumber(NaN); // false
sinma.isNumber(Infinity); // true
```
#### 使用范例
```javascript
// 數(shù)值輸入驗(yàn)證
function validateNumberInput(input) {
if (!sinma.isNumber(input)) {
return {
valid: false,
message: '請(qǐng)輸入有效的數(shù)字'
};
}
if (input < 0) {
return {
valid: false,
message: '數(shù)字不能為負(fù)數(shù)'
};
}
return {
valid: true,
value: input
};
}
// 數(shù)組中數(shù)字過濾
const mixedArray = [1, '2', 3.14, 'hello', null, 42];
const numbers = mixedArray.filter(sinma.isNumber);
console.log(numbers); // [1, 3.14, 42]
```
---
### isChinese(value) - 中文字符驗(yàn)證
判斷字符串是否全部為中文字符。
#### 參數(shù)
- `value` {string} - 待驗(yàn)證的字符串
#### 返回值
- {boolean} - 全部為中文字符返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
const chineseRegex = /^[\u4e00-\u9fa5]+$/;
function isChinese(value) {
if (typeof value !== 'string') return false;
return chineseRegex.test(value);
}
```
#### 使用方法
```javascript
sinma.isChinese('你好'); // true
sinma.isChinese('中文測(cè)試'); // true
sinma.isChinese('hello'); // false
sinma.isChinese('你好world'); // false
sinma.isChinese(''); // false
```
#### 使用范例
```javascript
// 中文姓名驗(yàn)證
function validateChineseName(name) {
if (!name) {
return { valid: false, error: '姓名不能為空' };
}
if (!sinma.isChinese(name)) {
return { valid: false, error: '請(qǐng)輸入中文姓名' };
}
if (name.length < 2 || name.length > 4) {
return { valid: false, error: '姓名長(zhǎng)度應(yīng)為2-4個(gè)字符' };
}
return { valid: true };
}
// 文本內(nèi)容過濾
function extractChineseText(text) {
return text.split('').filter(char => sinma.isChinese(char)).join('');
}
console.log(extractChineseText('Hello你好World世界123'));
// 輸出: '你好世界'
```
---
### isUrl(value) - URL驗(yàn)證
驗(yàn)證URL地址格式是否正確。
#### 參數(shù)
- `value` {string} - 待驗(yàn)證的URL地址
#### 返回值
- {boolean} - 驗(yàn)證通過返回 `true`,否則返回 `false`
#### 功能代碼
```javascript
const urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/;
function isUrl(value) {
if (typeof value !== 'string') return false;
return urlRegex.test(value);
}
```
#### 使用方法
```javascript
sinma.isUrl('https://www.example.com'); // true
sinma.isUrl('http://test.co.uk'); // true
sinma.isUrl('www.google.com'); // true
sinma.isUrl('invalid-url'); // false
sinma.isUrl('ftp://example.com'); // false
```
#### 使用范例
```javascript
// 鏈接驗(yàn)證和格式化
function processUrl(url) {
if (!url) {
return { valid: false, error: 'URL不能為空' };
}
if (!sinma.isUrl(url)) {
return { valid: false, error: '請(qǐng)輸入正確的URL格式' };
}
// 自動(dòng)添加協(xié)議
const formattedUrl = url.startsWith('http') ? url : `https://${url}`;
return {
valid: true,
originalUrl: url,
formattedUrl: formattedUrl
};
}
const result = processUrl('www.example.com');
console.log(result);
// {
// valid: true,
// originalUrl: 'www.example.com',
// formattedUrl: 'https://www.example.com'
// }
```
## 綜合示例
```javascript
// 用戶注冊(cè)表單驗(yàn)證
function validateRegistrationForm(formData) {
const errors = [];
// 驗(yàn)證手機(jī)號(hào)
if (!sinma.isPhone(formData.phone, true)) {
errors.push('請(qǐng)輸入正確的手機(jī)號(hào)碼');
}
// 驗(yàn)證郵箱
if (!sinma.isEmail(formData.email)) {
errors.push('請(qǐng)輸入正確的郵箱地址');
}
// 驗(yàn)證身份證
if (!sinma.isIdCard(formData.idCard, true)) {
errors.push('請(qǐng)輸入正確的身份證號(hào)碼');
}
// 驗(yàn)證中文姓名
if (!sinma.isChinese(formData.name)) {
errors.push('請(qǐng)輸入中文姓名');
}
// 驗(yàn)證個(gè)人網(wǎng)站(可選)
if (formData.website && !sinma.isUrl(formData.website)) {
errors.push('請(qǐng)輸入正確的網(wǎng)站地址');
}
return {
valid: errors.length === 0,
errors: errors
};
}
// 使用示例
const userData = {
name: '張三',
phone: '13812345678',
email: 'zhangsan@example.com',
idCard: '110101199003070134',
website: 'www.zhangsan.com'
};
const validation = validateRegistrationForm(userData);
console.log(validation);
```
## 注意事項(xiàng)
1. **類型安全**: 所有驗(yàn)證函數(shù)都會(huì)先檢查輸入類型,非預(yù)期類型會(huì)返回 `false`
2. **性能優(yōu)化**: 使用預(yù)編譯的正則表達(dá)式,避免重復(fù)編譯
3. **中文優(yōu)化**: 專門針對(duì)中國(guó)大陸的數(shù)據(jù)格式進(jìn)行優(yōu)化
4. **嚴(yán)格模式**: 部分函數(shù)支持嚴(yán)格驗(yàn)證模式,提供更準(zhǔn)確的驗(yàn)證結(jié)果
5. **向后兼容**: 保留舊版本API別名,如 `isPhonenum`、`isSfz` 等
## 相關(guān)模塊
- [中文處理模塊](./chinese.md) - 提供身份證信息提取等中文相關(guān)功能
- [字符串模塊](./string.md) - 提供字符串處理和格式化功能
