ใช้ Regular Expression กับ NSPredicate เพื่อ Validate Email และ Phone Number แทนการเขียน if-else หลายเงื่อนไข
Extension สำหรับ String
extension String {
var isValidEmail: Bool {
let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
return predicate.evaluate(with: self)
}
var isValidPhone: Bool {
// รูปแบบ US: 123-456-7890
let regex = "^\\d{3}-\\d{3}-\\d{4}$"
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
return predicate.evaluate(with: self)
}
// รูปแบบไทย: 08x-xxx-xxxx หรือ 02-xxx-xxxx
var isValidThaiPhone: Bool {
let regex = "^(0[689]\\d{7}|02\\d{7})$" // 08x, 09x, 06x, 02
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
return predicate.evaluate(with: self)
}
}
การใช้งาน
print("test@email.com".isValidEmail) // true
print("invalid-email".isValidEmail) // false
print("081-234-5678".isValidThaiPhone) // true
print("123-456-7890".isValidPhone) // true (US format)
Regex Email ที่ครอบคลุมมากขึ้น (RFC 5322)
let emailRegex = "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"
หมายเหตุ: Regex นี้ครอบคลุมกรณีส่วนใหญ่ แต่ validation จริงควรส่ง OTP ยืนยันอีเมล
Phone Number แบบ International (E.164)
var isValidInternationalPhone: Bool {
let regex = "^\\+[1-9]\\d{1,14}$" // E.164 format
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
return predicate.evaluate(with: self)
}
Best Practice
- Client-side validation เพื่อ UX (Real-time feedback)
- Server-side validation บังคับ (Security)
- ใช้ Library เช่น
PhoneNumberKitสำหรับ Phone 複雜