Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

Validate Email และ Phone Number ใน Swift

ใช้ 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 複雜