Validator.js 是一個流行的 JavaScript 函式庫,專門用來進行字串驗證和清理。它提供了多種用於處理常見驗證需求的方法,像是檢查電子郵件格式、URL 格式、數字範圍等,並且還支援語言本地化,使其在國際化應用中非常有用。 [官方連結](https://validatejs.org/) ## Validator.js 常見功能 #### 驗證電子郵件格式 使用 validator.isEmail() 方法來檢查字串是否為有效的電子郵件地址。 ``` const email = "example@example.com"; if (validator.isEmail(email)) { console.log("有效的電子郵件地址"); } else { console.log("無效的電子郵件地址"); } ``` #### 驗證 URL 格式 使用 validator.isURL() 方法來檢查字串是否為有效的 URL。 ```js const url = "https://www.example.com"; if (validator.isURL(url)) { console.log("有效的 URL"); } else { console.log("無效的 URL"); } ``` #### 檢查是否為數字 使用 validator.isNumeric() 方法來檢查字串是否包含數字。 ```js const numString = "12345"; if (validator.isNumeric(numString)) { console.log("是數字"); } else { console.log("不是數字"); } ``` #### 檢查字串是否符合正則表達式 使用 validator.matches() 方法來檢查字串是否符合指定的正則表達式。 ```js const password = "Password123"; const regex = /^(?=.*[A-Z])(?=.*\d)/; // 至少一個大寫字母和一個數字 if (validator.matches(password, regex)) { console.log("密碼格式正確"); } else { console.log("密碼格式錯誤"); } ``` #### 檢查是否為日期格式 使用 validator.isDate() 方法來檢查字串是否為有效的日期格式。 ```js const date = "2024-11-16"; if (validator.isDate(date)) { console.log("有效的日期"); } else { console.log("無效的日期"); } ``` 這邊也提供一個實際範例給同學參考: ```js const { useState } = React; function App() { const [formData, setFormData] = useState({ name: "", email: "" }); const [errors, setErrors] = useState({ name: "", email: "" }); // 處理表單提交 const handleSubmit = (e) => { e.preventDefault(); const newErrors = validateForm(); if (Object.keys(newErrors).length === 0) { alert("表單提交成功!"); } else { setErrors(newErrors); } }; // 驗證表單 const validateForm = () => { const newErrors = {}; // 檢查姓名是否為空 if (!formData.name.trim()) { newErrors.name = "姓名是必填欄位"; } // 使用 window.validator 檢查 email 格式 if (!window.validator.isEmail(formData.email)) { newErrors.email = "無效的電子郵件格式"; } return newErrors; }; // 處理表單欄位更改 const handleChange = (e) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); setErrors({ ...errors, [name]: "" }); // 清除欄位錯誤 }; return ( <div style={{ maxWidth: "400px", margin: "auto", padding: "20px" }}> <h2>註冊表單</h2> <form onSubmit={handleSubmit}> <div style={{ marginBottom: "10px" }}> <label> 姓名: <input type="text" name="name" value={formData.name} onChange={handleChange} /> </label> {errors.name && <p style={{ color: "red" }}>{errors.name}</p>} </div> <div style={{ marginBottom: "10px" }}> <label> 電子郵件: <input type="email" name="email" value={formData.email} onChange={handleChange} /> </label> {errors.email && <p style={{ color: "red" }}>{errors.email}</p>} </div> <button type="submit">提交</button> </form> </div> ); } ReactDOM.render(<App />, document.getElementById("root")); ``` ## 題目 請複製 (右下角 fork)這個[範例](https://codepen.io/yen-kg/pen/ZEgZeZw?editors=1010),並且完成下面條件: 1. 請替 email 跟密碼欄位加上 validator 的驗證。 2. email 若不符合規則的話請利用 setEmailError 並加上「請輸入有效的電子郵件地址」的錯誤文字提示。 3. 密碼需要加上「最少六個字」的規則,若不符合規則的話請利用 setPasswordError 並加上「密碼至少需要6個字」的錯誤文字提示。 4. 點擊提交按鈕,欄位都有成功驗證時,請利用 alert 顯示「表單提交成功!」。 ## 回報流程 將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: ``` const handleSubmit = (event) => { event.preventDefault(); if (!validator.isEmail(email)) { setEmailError('請輸入有效的電子郵件地址'); } else { setEmailError(''); } if (!validator.isLength(password, { min: 6 })) { setPasswordError('密碼至少需要6個字'); } else { setPasswordError(''); } if (validator.isEmail(email) && validator.isLength(password, { min: 6 })) { alert('表單提交成功!'); } }; ``` --> 回報區 --- | # | Discord | CodePen / 答案 | |:---:|:-------------- |:----------------------------------------------------------------------------- | | 1 | Noy(Toad) | [Codepen](https://codepen.io/MochiCodingPen/pen/GgRKBjX) | | 2 | 毛巾 | [Codepen](https://codepen.io/bqdcjboa-the-solid/pen/GgRRgMg) | | 3 | tim | [Codepen](https://codepen.io/jskrtivy-the-animator/pen/VYwwLvv?editors=1010) | | 4 | 4chan | [Codepen](https://codepen.io/ijuolaqc-the-looper/pen/yyLLNVR) | |5|Hailey|[CodePen](https://codepen.io/sxbokfja-the-flexboxer/pen/GgRRJME?editors=1011)| |6|Kaya|[CodePen](https://codepen.io/kayaribi/pen/xbxxgRg)| |7|Aaron 謝宗佑|[CodePen](https://codepen.io/aaron-hsieh/pen/emYYWqO)| |8|Sonia|[CodePen](https://codepen.io/YUJOU/pen/YPzzzmd?editors=0011)| | 9 | Amanda | [Codepen](https://codepen.io/cym199922/pen/xbxxaEW) | | 10 | ya_meow | [Codepen](https://codepen.io/gkfxzvcb-the-bashful/pen/WbNNBRX)| | 11 |邵|[Codepen](https://codepen.io/ukscrlno-the-typescripter/pen/GgRgmoo?editors=0011)| | 12 | mercury2508. | [Codepen](https://codepen.io/Mercury2508/pen/LEYEyoG) | | 13 | 嚼勁先生 | [Codepen](https://codepen.io/James520284/pen/RNwNZpv) | | 14 | Jasmine | [Codepen](https://codepen.io/Jasmine-Lin-the-vuer/pen/vEYEZKZ) | | 15 | Clove | [Codepen](https://codesandbox.io/p/sandbox/f42kmy) | | 16 | Johnson | [Codepen](https://codepen.io/crpbugqy-the-typescripter/pen/qEBEjOZ) | | 17 | 泊岸 | [Codepen](https://codepen.io/qoq77416416/pen/ByaoLbX?editors=0010) | | 18 | 蘑菇星星 | [Codepen](https://codepen.io/brrrieon-the-vuer/pen/jEOMVMd?editors=1010) | | 19 | Toung | [Codepen](https://codepen.io/Toung/pen/dPyPxww?editors=1011)| | 20 | 姜承 | [Codepen](https://codepen.io/Troy0718/pen/KwKxYGO?editors=1010)| | 21 | jinliu214 | [Codepen](https://codepen.io/jinliu214/pen/zxxgEbO?editors=0010) | | 22 | chris | [Codepen](https://codepen.io/chris-chen-the-selector/pen/OPVqGde) | | 23 | shin_kai | [Codepen](https://codepen.io/KAI-SHIN-the-animator/pen/xbZgqpO) | --- - 快速複製格式: ```markdown! | 0 | user | [Codepen]() | ```