2011-08-24 337 views
6

我發現iphone上的stackoverflow的各種電話號碼驗證,但似乎沒有任何驗證,他們似乎只是改變格式。示例Phone number formattingiPhone的簡單電話號碼驗證

目標:通過警報輸入此號碼。北美有或沒有破折號。

所以有一些代碼,但是每件事情都會像任何想法一樣無效。

- (void)textFieldDidEndEditing:(UITextField *)textField { 

NSString *[email protected]"^\\+(?:[0-9] ?){6,14}[0-9]$"; 
NSPredicate *no=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",str]; 
if([no evaluateWithObject:textField.text]==NO) 
    { 

     UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Please Enter correct contact no." delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; 

     [alert show]; 
     [alert release]; 

    } 
    else{ 
NSString *textValue = textField.text; 
NSLog(@"Value: %@", textValue); 
    } 
} 
+0

你真的不應該限制自己這種類型的驗證 - 只需使用像numverify.com這樣的免費JSON API – Frank

回答

3

首先,真正的電話號碼驗證相當複雜。您是否僅限於NANP(北美編號計劃),還是您在尋找E.164號碼?它看起來像你試圖主要匹配E.164,但這通常不是大多數人會輸入的數字。

您的匹配需要一個加號,然後是一個7到15之間的數字序列,並在它們之間有可選空格。你是這個意思嗎?你傳遞了什麼字符串?

請注意,從iOS4開始,有NSRegularExpression這比NSPredicate要好一些。

+0

好的,我添加了這個:目標:這個數字是通過警報輸入的。北美有或沒有破折號。謝謝 – Rick

+3

你的正則表達式看起來不像這樣。它甚至沒有破折號。你爲什麼相信它會起作用?搜索http://regexlib.com「NANP」找到這個很多正則表達式。所有的都有各種權衡。我建議儘可能寬容任何人類的手。 –

+0

@「^ \\ +?[0-9] * $」這個可以工作。有趣的在regexlib.com上的第一個不在iOS中,但在java android sdk中。 – Rick

26

編輯:我再次讀到這個問題,看到你想驗證,不突出顯示的電話號碼,所以我搬上了NSDataDetector的部分。

您可以使用NSDataDetector(這是NSRegularExpression一個專門的子類)在NSString搜索電話號碼(這使用iPhone的默認電話號碼檢測算法,我相信)。

NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber 
                  error:&error]; 
NSUInteger numberOfMatches = [detector numberOfMatchesInString:string 
                 options:0 
                 range:NSMakeRange(0, [string length])]; 

如果使用UITextView(但可能不會UITextField像你在這裏使用),你可以亮點通過設置dataDetectorTypes財產使用iPhone的默認電話號碼檢測算法的電話號碼:

textView.dataDetectorTypes = UIDataDetectorTypePhoneNumber; 

查看UIDataDetectorTypes其他類型的數據檢測器。

+0

我試過NSDataDector,雖然我沒有得到它的工作,我相信這將是一條路。當我有更多時間玩它時,我會將其更改爲這種格式。謝謝 – Rick

+0

NSDataDetector是如何失效的? –

+0

嘿,爲你做這個工作? –

0

使用此驗證,您只能輸入10個數字。您可以根據您的要求更改它的長度。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

BOOL valid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_INTEGERS] evaluateWithObject:_textFieldValidate.text]; 



     if(valid){ 
      if(range.length + range.location > textField.text.length) 
      { 
       return NO; 
      } 

      NSUInteger newLength = [textField.text length] + [string length] - range.length; 
      return newLength <= 10; 


} 


return YES; 

} 

希望這會對你有幫助。