首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 正則驗證郵箱失敗?小心輸入框隱形空格!

     編輯:程式設計綜合問答

代碼回顧

- (BOOL)isValidateEmail:(NSString *)email {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailTest evaluateWithObject:email];
}

問題現象

代碼邏輯正確,正則表達式符合 RFC 5322 簡化規則,但在實際輸入時驗證失敗。

真相:輸入字符串包含不可見空格

  • 用戶複製郵箱、自動填充、鍵盤聯想輸入時,極易在首尾或中間混入 空格(U+0020)、換行符、零寬空格 等不可見字符。
  • 正則 SELF MATCHES 要求整個字符串完全匹配,任何多餘字符導致失敗。

一行代碼修復:驗證前 Trim 空白字符

- (BOOL)isValidateEmail:(NSString *)email {
    // 關鍵:去除首尾空白字符(空格、換行、制表符等)
    email = [email stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailTest evaluateWithObject:email];
}

進階建議

  1. 使用更健壯的正則(支持更長頂級域、子域名):
    @"^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"
  2. 集成第三方驗證庫:如 RegexKitLite、Validator,處理邊界情況更全面。
  3. UI 層攔截:在 UITextFieldDelegate 的 textField:shouldChangeCharactersInRange:replacementString: 中禁止輸入空格,或實時 Trim 顯示。

總結

正則驗證失效 90% 因「髒數據」。永遠記住:驗證前先清洗輸入。`stringByTrimmingCharactersInSet:` 是你的好朋友。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved