2009-10-23 2 views

risposta

12

Se tutte le sottostringhe sono separate da spazi, è possibile provare a ottenere una matrice di sottostringhe utilizzando [myString componentsSeparatedByString:@" "]. Quindi è possibile verificare il risultato di [NSUrl URLWithString:yourSubstring]. Restituirà zero se la sottostringa non è un collegamento corretto.

+0

Forse mi hai frainteso o forse ti ho frainteso ma http://www.abc.com è solo un esempio. Quello che voglio dire è come ottenere una sottostringa con il formato di un collegamento url da NSString. In attesa di risposta – ThyPhuong

+0

Hmm ... NSArray * subStrings = [yourString componentsSeparatedByString: @ ""]; for (NSString * subString in subStrings) { if ([NSUrl URLWithString: subString]) { NSLog (@ "Questa sottostringa è un URL:% @", sottostringa); } } – Morion

+0

Se le sottostringhe sono separate da @ "", nella console verranno visualizzate tutte le sottostringhe, ovvero URL corretti. – Morion

0

Una possibile soluzione potrebbe essere l'utilizzo di espressioni regolari. Controlla RegexKit.

+2

Regexp è quasi sempre la soluzione sbagliata. Soprattutto gli URL corrispondenti sono molto difficili, in quanto la regexp corretta è davvero lunga. Ad esempio, gli indirizzi e-mail di corrispondenza sono difficili: http://www.regular-expressions.info/email.html –

+0

Punto ben preso. –

+0

"Alcune persone, di fronte a un problema, pensano" Lo so, userò le espressioni regolari. "Ora hanno due problemi." http://regex.info/blog/2006-09-15/247 –

50

So che questa è una risposta molto tardi, ma è possibile ottenere la stringa "http://www.abc.com" con il seguente codice:

[@"abc xyz http://www.abc.com aaa bbb ccc" substringWithRange:NSMakeRange(8, 18)] 

Naturalmente, è ancora possibile utilizzare un NSString per quello.

+0

Sembra non funzionare quando la mia stringa è più corta dell'intervallo, cosa posso fare allora? – powtac

+2

Basta dare un intervallo diverso. Potrebbe essere meglio controllare la lunghezza '[@" Some string "length]' e aggiungere quel numero al primo per trovare il secondo. – Justin

26

Prova questo:

 [yourString substringToIndex:<#(NSUInteger)#>]; 
//or 
     [yourString substringFromIndex:<#(NSUInteger)#>]; 
//or   
     [yourString substringWithRange:<#(NSRange)#>]; 
2

Questo può anche provare a risolvere il problema:

NSArray *data = [@"abc xyz http://www.abc.com aaa bbb ccc" componentsSeparatedByString:@" "]; 

for(NSString* str in data) 
{ 
    if([NSURLConnection canHandleRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]]) 
     NSLog(@"%@",[[NSString alloc ] initWithFormat:@"Found a URL: %@",str]); 
} 

Speranza che aiuta!

2

Trovo che il PHP substr() sia davvero conveniente. Guarda il mio NSString category se si sta cercando di essere in grado di fare qualcosa del genere:

substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12) 

o

substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18) 

Entrambi vi darà il risultato di http://www.example.com

Ecco una copia della codice rilevante:

__attribute__((overloadable)) 
NSString *substr(NSString *str, int start) 
{ 
    return substr(str, start, 0); 
} 

__attribute__((overloadable)) 
NSString *substr(NSString *str, int start, int length) 
{ 
    NSInteger str_len = str.length; 
    if (!str_len) return @""; 
    if (str_len < length) return str; 
    if (start < 0 && length == 0) 
    { 
     return [str substringFromIndex:str_len+start]; 
    } 
    if (start == 0 && length > 0) 
    { 
     return [str substringToIndex:length]; 
    } 
    if (start < 0 && length > 0) 
    { 
     return [[str substringFromIndex:str_len+start] substringToIndex:length]; 
    } 
    if (start > 0 && length > 0) 
    { 
     return [[str substringFromIndex:start] substringToIndex:length]; 
    } 
    if (start > 0 && length == 0) 
    { 
     return [str substringFromIndex:start]; 
    } 
    if (length < 0) 
    { 
     NSString *tmp_str; 
     if (start < 0) 
     { 
      tmp_str = [str substringFromIndex:str_len+start]; 
     } 
     else 
     { 
      tmp_str = [str substringFromIndex:start]; 
     } 
     NSInteger tmp_str_len = tmp_str.length; 
     if (tmp_str_len + length <= 0) return @""; 
     return [tmp_str substringToIndex:tmp_str_len+length]; 
    } 

    return str; 
} 
2

Ecco la mia versione dello script ... Hopefu lly è pulito e facile da implementare. Si fa un substr dei caratteri basati sui limiti ... mio è utilizzato per una textarea, ma può ovviamente essere adattato alle textfields :)

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 

     int maxLength = 100; 
     int currentLength = [self.messageField.text length]; 

     if(currentLength > maxLength) 
     { 

      NSString *newMessageText = [self.messageField.text substringWithRange:NSMakeRange(0, maxLength)]; 

      [self.messageField setText:newMessageText]; 

      return NO; 

    } 
    else 
    { 

      return YES; 

    } 

} 
0

Se la stringa in input garanzie semplici (per esempio la garanzia che i token nella stringa sono sempre delineati da un carattere di spazio) quindi divisi sul carattere dello spazio e testare ciascun elemento per @"http://" come prefisso.

NSString *input = @"abc xyz http://www.example.com aaa bbb ccc"; 

NSArray *parts = [input componentsSeparatedByString:@" "]; 
for (NSString *part in parts) { 
    if ([part hasPrefix:@"http://"]) { 
     // Found it! 
    } 
} 

Questo può essere ottimizzato in base alle esigenze dell'applicazione; ad esempio, scegliere di cortocircuitare il ciclo una volta trovato l'elemento o utilizzare i filtri in BlocksKit per ottenere solo gli elementi che iniziano con il prefisso. Una soluzione ideale dipenderà dalla natura della stringa di input e da ciò che stai cercando di ottenere con essa.