JavaScript中的校驗(yàn)機(jī)制三種寫法舉例(如手機(jī)號(hào)碼、電話號(hào)碼校驗(yàn))
在表單驗(yàn)證場(chǎng)景中,getValueFromEvent
、pattern
和 validator
是三種不同的驗(yàn)證機(jī)制
方法 | 作用 | 適用場(chǎng)景 |
---|---|---|
getValueFromEvent | 從表單事件(如 onChange )中提取值,通常用于預(yù)處理輸入數(shù)據(jù) | 需要自定義事件值解析(如文件上傳) |
pattern | 通過正則表達(dá)式對(duì)輸入值進(jìn)行格式校驗(yàn),屬于聲明式規(guī)則 | 簡(jiǎn)單格式校驗(yàn)(如手機(jī)號(hào)、郵箱) |
validator | 通過函數(shù)實(shí)現(xiàn)自定義邏輯驗(yàn)證,支持異步操作和復(fù)雜條件判斷 | 動(dòng)態(tài)校驗(yàn)(如密碼強(qiáng)度、聯(lián)動(dòng)字段) |
解析
第一位是【1】開頭,第二位則是【3,4,5,7,8】,第三位則是【0-9】,第三位之后則是數(shù)字【0-9】。從而我們可以得出一個(gè)符合當(dāng)前的手機(jī)號(hào)碼驗(yàn)證正則表達(dá)式(不適用電話)。
^1(3|4|5|7|8)\d{9}$ 或者 ^1[34578]\d{9}$ 或 ^1[34578][0-9]{9}$ 或 ^1[3,4,5,7,8][0-9]{9}$
0. ^表示開始
1. 正則里面的中括號(hào)[]只能匹配其中一個(gè)
2. 如果要匹配特定幾組字符串的話,那就必須使用小括號(hào)()加或|
3. |在中括號(hào)里面也是一個(gè)字符,并不代表或
4. [3457]匹配3或者4或者5或者7,而(3457)把3457這四個(gè)數(shù)當(dāng)成整體匹配,若要跟前面一樣可以加或(3|4|5|7)。
5. [34|57]匹配3或者4或者|或者5或者7,而(34|57)匹配34或者57。
6. \d{9}:匹配9個(gè)數(shù)字(0~9任意組合9個(gè)數(shù)字)。其中,\d 代表一個(gè)數(shù)字字符,{9} 表示前面的模式(即 \d)應(yīng)重復(fù)9次。
總結(jié)
方案 | 推薦度 | 適用場(chǎng)景 |
---|---|---|
rules + pattern | ????? | 簡(jiǎn)單正則驗(yàn)證(推薦) |
rules + validator | ???? | 復(fù)雜自定義驗(yàn)證 |
手動(dòng) checkPhone | ? | 遺留代碼或特殊需求 |
最佳實(shí)踐:優(yōu)先使用 Ant Design 的 rules
和 pattern
,避免手動(dòng)操作 DOM 和 alert
寫法1:(不推薦)
function checkPhone(){ var phone = document.getElementById('phone').value; if(!(/^1[34578]\d{9}$/.test(phone))){ alert("手機(jī)號(hào)碼有誤,請(qǐng)重填"); return false; } } 或者 function checkPhone(){ var phone = document.getElementById('phone').value; var phoneRegex = /^1(3|4|5|7|8)\d{9}$/ if(!(phoneRegex.test(phone))){ alert("手機(jī)號(hào)碼有誤,請(qǐng)重填"); return false; } } // 在提交表單時(shí)調(diào)用 handleSubmit = (e) => { e.preventDefault(); if (checkPhone()) { // 驗(yàn)證通過,提交表單 this.props.form.validateFields((err, values) => { if (!err) { console.log('提交數(shù)據(jù):', values); } }); } }; // handleSubmit = () => { // const phone = document.getElementById('phone').value; // if (!this.checkPhone(phone)) { // alert("手機(jī)號(hào)碼有誤"); // 手動(dòng)觸發(fā)驗(yàn)證? // } // }; const FormItem = Form.Item <Row> <Col> <FormItem label='聯(lián)系電話'> {getFieldDecorator('phone', { rules:[{ required: true, message: '請(qǐng)輸入正確的聯(lián)系電話!', }], initialValue: '', })( <Input id='phone' /> )} </FormItem> </Col> <Button onClick={this.handleSubmit}>提交</Button> </Row>
?? 缺點(diǎn):
- 直接操作 DOM(
document.getElementById
),不符合 React 的最佳實(shí)踐。 - 錯(cuò)誤提示用
alert
,用戶體驗(yàn)較差(Ant Design 的表單錯(cuò)誤提示更優(yōu)雅)。
寫法2:pattern 正則表達(dá)式
const FormItem = Form.Item <Row> <Col> <FormItem label='聯(lián)系電話'> {getFieldDecorator('phone', { rules:[ { required: true, message: '請(qǐng)輸入聯(lián)系電話!' }, { pattern: /^1(3|4|5|7|8)\d{9}$/, message: '請(qǐng)輸入11位有效手機(jī)號(hào)!' }, ], initialValue: '', })( <Input id='phone' maxLength={11} /> )} </FormItem> </Col> </Row>
? 優(yōu)點(diǎn):
- 不需要額外寫
checkPhone
函數(shù),直接用pattern
進(jìn)行正則驗(yàn)證。 - Ant Design 會(huì)自動(dòng)處理錯(cuò)誤提示,不需要手動(dòng)
alert
。
寫法3:validator 自定義驗(yàn)證(更靈活)
(需求:除了漢字和字母不能輸入以外,其他的都可輸入)
const FormItem = Form.Item <Row> <Col> <FormItem label='聯(lián)系電話'> {getFieldDecorator('phone', { rules:[ { required: true, message: '請(qǐng)輸入聯(lián)系電話!' }, { pattern: /^1[3-9]\d{9}$/, message: '請(qǐng)輸入11位有效手機(jī)號(hào)!' }, { validator: (rule, value, callback) => { const reg = new RegExp('[\u4E00-\u9FA5]') const reg1 = new RegExp('[A-Za-z]') if(reg.test(value)){ callback('手機(jī)號(hào)碼不能輸入漢字!') } else if (reg1.test(value)){ callback('手機(jī)號(hào)碼不能輸入字母!') } else { callback() } } }], })( <Input id='phone' maxLength={11} /> )} </FormItem> </Col> </Row>
? 優(yōu)點(diǎn):
- 可以自定義更復(fù)雜的驗(yàn)證邏輯(如異步校驗(yàn))。
- 仍然不需要手動(dòng)操作 DOM(
document.getElementById
)。
擴(kuò)展建議
國(guó)際號(hào)碼支持
若需支持國(guó)際號(hào)碼,可替換正則為:
pattern: /^(?:\+?86)?1[3-9]\d{9}$|^(?:\+?\d{1,3})?\d{6,15}$/
動(dòng)態(tài)校驗(yàn)
通過 setFieldsValue
實(shí)現(xiàn)聯(lián)動(dòng)校驗(yàn)(如區(qū)號(hào)+座機(jī)號(hào)場(chǎng)景)。
防抖優(yōu)化
頻繁校驗(yàn)時(shí)建議添加防抖:
import { debounce } from 'lodash'; validator: debounce((rule, value, callback) => { ... }, 300) // 代碼: rules: { username: [ { required: true, message: '必填項(xiàng)' }, { validator: debounce((rule, value, callback) => { if (/[^a-z]/.test(value)) callback('僅允許小寫字母'); else callback(); }, 1000), trigger: 'blur' // 明確防抖觸發(fā)條件。防抖場(chǎng)景必須聲明?:防抖函數(shù)需綁定明確的事件(如 blur 或 change)? } ] }
場(chǎng)景 | 防抖配置 | 優(yōu)勢(shì) |
---|---|---|
輸入實(shí)時(shí)搜索 | delay: 300ms | 減少搜索接口調(diào)用 |
異步唯一性校驗(yàn) | delay: 1000ms | 避免頻繁請(qǐng)求 |
多字段聯(lián)合校驗(yàn) | 共享防抖實(shí)例 | 統(tǒng)一控制校驗(yàn)節(jié)奏 |
trigger: 'blur'
表示輸入框失去焦點(diǎn)時(shí)觸發(fā)校驗(yàn),適合實(shí)時(shí)性要求較低的場(chǎng)景(如避免輸入中途頻繁提示)17。trigger: 'change'
會(huì)在值變化時(shí)立即校驗(yàn),適合需要即時(shí)反饋的交互(如密碼強(qiáng)度檢測(cè))場(chǎng)景 是否需要顯式聲明 原因 需要實(shí)時(shí)校驗(yàn) 可選(建議聲明) 明確控制觸發(fā)時(shí)機(jī),避免依賴默認(rèn)行為 僅提交時(shí)校驗(yàn) 可不寫 默認(rèn)行為已滿足需求 防抖場(chǎng)景 必須聲明 防抖函數(shù)需綁定明確的事件觸發(fā)點(diǎn)(如 blur
),否則無法生效
電話號(hào)碼校驗(yàn),上面的pattern方法、validator方法都適用
function phoneValid(number) { // 去除任何非數(shù)字字符 const cleaned = number.replace(/\D/g, ''); // 定義正則表達(dá)式驗(yàn)證規(guī)則 const mobilePattern = /^1[3-9]\d{9}$/; // 手機(jī)號(hào) const tellPattern = /^0\d{2,3}-?\d{7,8}$/; // 電話號(hào) // 驗(yàn)證是否符合手機(jī)號(hào)碼或座機(jī)號(hào)碼格式 if (mobilePattern.test(cleaned) || tellPattern.test(cleaned)) { return true; } else { return false; } } // 示例用法 console.log(phoneValid('13800138000')); // true console.log(phoneValid('010-12345678')); // true console.log(phoneValid('12345678')); // false console.log(phoneValid('021-87654321')); // true console.log(phoneValid('18912345678')); // true
空格校驗(yàn)
const FormItem = Form.Item <Row> <Col> <FormItem label='聯(lián)系電話'> {getFieldDecorator('phone', { getValueFormEvent: (e) => e.target.value.replace(/^\s+|\s$/g,'') initialValue: '', })( <Input id='phone' /> )} </FormItem> </Col> </Row> // " hello world ".replace(/^\s+|\s+$/g, ""); // 輸出 "hello world"?:ml-citation{ref="1,3" data="citationList"}
語法 | 含義 | 示例匹配場(chǎng)景 | |
---|---|---|---|
^\s+ | 匹配字符串開頭的1個(gè)或多個(gè)空白字符(空格、制表符、換行符等) | " hello" 中的開頭空格 | |
\s+$ | 匹配字符串末尾的1個(gè)或多個(gè)空白字符 | "world " 中的末尾空格 | |
` | ` | 邏輯“或”操作符,匹配兩者之一 | 同時(shí)處理開頭和末尾空格 |
g | 全局匹配模式,替換所有符合條件的內(nèi)容(而非僅第一個(gè)) | 多次替換 |
\s
匹配單個(gè)空白字符,包括:- 空格(
- 制表符(
\t
) - 換行符(
\n
) - 換頁符(
\f
)等。
注:\S
表示其反向匹配(非空白字符)。
- 空格(
^
和$
^
匹配字符串的起始位置(需在開頭)。$
匹配字符串的結(jié)束位置(需在末尾)。
+
表示前面的字符(\s
)至少出現(xiàn)1次(等價(jià)于{1,}
)若需嚴(yán)格匹配純空格(不含制表符等),可用
[ ]+
替代\s+
在拆分字符串時(shí),
\s
常用于分割單詞(如split(/\s+/)
)正則表達(dá)式 作用 區(qū)別 /\s+/g
匹配所有連續(xù)空白字符 不限定位置,包括中間空格3 /^\s+/g
僅匹配開頭空白字符 忽略末尾空格3 /\s+$/g
僅匹配末尾空白字符 忽略開頭空格
總結(jié)
到此這篇關(guān)于JavaScript中的校驗(yàn)機(jī)制三種寫法的文章就介紹到這了,更多相關(guān)JS手機(jī)號(hào)碼、電話號(hào)碼校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js+css實(shí)現(xiàn)文字散開重組動(dòng)畫特效代碼分享
這篇文章主要介紹了js+css實(shí)現(xiàn)文字散開重組動(dòng)畫特效,需要的朋友可以參考下2015-08-08Electron無邊框自定義窗口拖動(dòng)的問題小結(jié)
最近使用了electron框架,發(fā)現(xiàn)如果自定義拖動(dòng)是比較實(shí)用的;特別是定制化比較高的項(xiàng)目,如果單純的使用-webkit-app-region:?drag;會(huì)讓鼠標(biāo)事件無法觸發(fā),這篇文章主要介紹了Electron無邊框自定義窗口拖動(dòng)的問題小結(jié),需要的朋友可以參考下2024-04-04js實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03js+CSS 圖片等比縮小并垂直居中實(shí)現(xiàn)代碼
本例子在在 ff 2.0/ ie6 / ie7 中測(cè)試通過。但在 opera 8.5 cn中沒有通過。希望大家測(cè)試。2008-12-12sass 中使用 /deep/ 修改 elementUI 組件樣式報(bào)錯(cuò)
這篇文章主要介紹了sass 中使用 /deep/ 修改 elementUI 組件樣式報(bào)錯(cuò)的解決方案,嘗試用 ::v-deep 替換 /deep/ ,成功解決了問題,感興趣的朋友跟隨小編一起看看吧2024-02-02