2011-05-11 11 views
6

Estoy tratando de obtener una URL de una simple frase NSString. Para que utilizo NSDataDetector en el siguiente código:NSDataDetector con NSTextCheckingTypeLink detecta URL y PhoneNumbers!

NSString *string = @"This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it and a number 097843."; 
NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil]; 
NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])]; 

for (NSTextCheckingResult *match in matches) { 

    if ([match resultType] == NSTextCheckingTypeLink) { 
    NSString *matchingString = [match description]; 
    NSLog(@"found URL: %@", matchingString); 
    } 
} 

El resultado es que se encuentra la URL y el número. El número se detecta como un número de teléfono:

found URL: http://abc.com/efg.php?EFAei687e3EsA 
found URL: tel:097843 

¿Eso es un error? ¿Alguien podría decirme cómo obtener la URL sin ese número de teléfono?

+0

Entendido! Para evitar obtener un número de teléfono, estoy verificando las primeras siete letras como: NSString * httpString = [aString substringWithRange: NSMakeRange (0,7)]; if ([httpString isEqualToString: @ "http: //"]) { // mi código } – user689081

+0

Es realmente extraño ya que hay otro NSTextCheckingType llamado 'NSTextCheckingTypePhoneNumber' específicamente para verificar los números de teléfono. – an0

Respuesta

12

NSDataDetector detecta necesariamente los números de teléfono como enlaces porque en el teléfono, puede tocarlos como si fueran un enlace para iniciar una llamada telefónica (o mantener pulsado para iniciar un mensaje de texto, etc.). Creo que la configuración regional actual (es decir, NSLocale) es lo que determina si una cadena de números se parece o no a un número de teléfono. Por ejemplo, en los Estados Unidos, se necesitarían al menos siete dígitos para ser reconocidos como un número de teléfono, ya que los números en los EE. UU. Son de la forma general: \d{3}-\d{4}.

En cuanto al reconocimiento de un enlace telefónico versus otro enlace, no es una buena idea buscar http:// al comienzo de la URL. Un simple ejemplo basta: ¿y si es un enlace https://? Entonces tu código se rompe.

La mejor manera de comprobar esto sería así:

NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])]; 

for (NSTextCheckingResult *match in matches) { 
    NSURL *url = [match URL]; 
    if ([[url scheme] isEqual:@"tel"]) { 
    NSLog(@"found telephone url: %@", url); 
    } else { 
    NSLog(@"found regular url: %@", url); 
    } 
} 
+0

El comportamiento de NSTextCheckingTypeLink detectando el número de teléfono es realmente extraño. Solo detecta números de 5 ~ 6 dígitos pero no números de teléfono reales como 888-6666. ¿Sabes por qué? ¿O es un error conocido? – an0

+0

Parece un error para mí ... este comportamiento se ha ido en iOS7 – ahalls