Je dois valider un numéro de téléphone international.
Je sais qu'il est difficile de valider un numéro de téléphone international, je vais donc rester simple:
+
ou 00 puis 6-14 chiffres
Mon code actuel utilisant une expression régulière ne fonctionne pas pour une raison que je ne peux pas résoudre. Il dit simplement qu'il ne peut pas ouvrir la regex et se bloque.
Voici mon code actuel:
NSString *phoneRegex = @"^[\+(00)][0-9]{6,14}$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
BOOL phoneValidates = [phoneTest evaluateWithObject:phoneNumber];
Où vais-je mal?
Merci!
NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}$";
Cette façon est un peu mieux. Votre code fonctionnera aussi bien si vous échappez le "\".
Copier/coller pour valider les numéros de téléphone:
- (BOOL)validatePhone:(NSString *)phoneNumber
{
NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}$";
NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
return [phoneTest evaluateWithObject:phoneNumber];
}
ou Open source Bibliothèque pour valider les numéros de téléphone
cela dépend de la sévérité de votre choix. Il ne semble pas que cette regex soit particulièrement stricte. cette regex dit:
commencez au début de la ligne faites correspondre un + (ou peut-être 1 ou 0) qui semble ambigu (mais peut ne pas dépendre de l'implémentation) car la capture entre parenthèses :() rompt la relation du + et du? peut-être égaré: correspond à n'importe quel chiffre 0-9 1 ou 0 fois 6-14 fois puis un chiffre 0-9 puis fin de ligne . vous remarquerez également que toute barre oblique inversée devra être doublé ... @ "\ b" pour une limite de Word. vous voudrez peut-être essayer quelque chose comme ...
@"\\b[\\d]{3}\\-[\\d]{3}\\-[\\d]{4}\\b"
would I think match your example, but it wouldn't match
(555) 555 - 5555 or
555.555.5555 or
+44 1865 55555
txtlpmobile.text est la chaîne (Mobile no ur va entrer)
int length = [self getLength:txtLpMobile.text];
if(length == 10) {
if(range.length == 0)
return NO;
}
if(length == 3){
NSString *num = [self formatNumber:txtLpMobile.text];
txtLpMobile.text = [NSString stringWithFormat:@"(%@) ",num];
if(range.length > 0) {
txtLpMobile.text = [NSString stringWithFormat:@"%@",[num substringToIndex:3]];
}
} else if(length == 6) {
NSString *num = [self formatNumber:txtLpMobile.text];
txtLpMobile.text = [NSString stringWithFormat:@"(%@) %@-",[num substringToIndex:3],[num substringFromIndex:3]];
if(range.length > 0) {
txtLpMobile.text = [NSString stringWithFormat:@"(%@) %@",[num substringToIndex:3],[num substringFromIndex:3]];
}
}
NSUInteger newLength;
newLength = [txtLpMobile.text length] + [string length] - range.length;
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
pour le numéro de formatage
-(NSString*)formatNumber:(NSString*)mobileNumber
{
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"+" withString:@""];
int length = [mobileNumber length];
if(length > 10)
{
mobileNumber = [mobileNumber substringFromIndex: length-10];
}
return mobileNumber;
}
pour obtenir de la longueur
-(int)getLength:(NSString*)mobileNumber
{
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
mobileNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"+" withString:@""];
int length = [mobileNumber length];
return length;
}
Dans Swift 4 -
func ValidateMobileNumber(txtFeid : UITextField, strChk : String, range: NSRange) -> Bool {
if txtFeid.text!.count >= 10 {
return false
}
let formatePre = "^((\\+)|(00))[0-9]{6,14}$"
let resultPredicate : NSPredicate = NSPredicate(format: "SELF MATCHES %@",formatePre)
return resultPredicate.evaluate(with: strChk)
}
Le seul bon moyen de valider les numéros de téléphone est d'utiliser l'incroyable LibPhoneNumber de Google . Il existe un port iOS ou vous pouvez exécuter l'implémentation JavaScript dans une variable UIWebView
masquée.
(Je l'ai fait il y a quelques années alors que leur port n'était pas encore iOS. Fonctionne comme un charme et est très rapide, même sur les anciens iPhones.)
Un moyen facile de valider le nombre de téléphone et la limite de mot de passe, il suffit de suivre le processus ci-dessous.
if ((self.mobileTxtFld.text.length < 10 )) {
[_mobileTxtFld becomeFirstResponder];
}
else if ((self.passwordTxtFld.text.length < kPasswordCharacterMinLimit) || (self.passwordTxtFld.text.length > kPasswordCharacterMaxLimit)) {
// show alert
}
après cela, vous pouvez implémenter la méthode déléguée textfiled "shouldChangeCharactersInRange" en écrivant simplement ce code.
if (textField == _mobileTxtFld) {
if([string rangeOfCharacterFromSet:ALLOWED_NUMBERS].location == NSNotFound){
NSUInteger newLength = [textField.text length] + [string length] - range.length;
if(newLength > kMobileNumberLimit - 1){
if(textField.text.length != kMobileNumberLimit){
textField.text = [NSString stringWithFormat:@"%@%@",textField.text,string];
}
[textField resignFirstResponder];
return NO;
}
else{
return YES;
}
}
else{
return NO;
}
}
return YES;
ici ALLOWED_NUMBERS et kMobileNumberLimit sont
#define kMobileNumberLimit 10
#define ALLOWED_NUMBERS [[NSCharacterSet decimalDigitCharacterSet] invertedSet]
#define minLimit 6
#define maxLimit 17