Ho una stringa separata dallo spazio come @"abc xyz http://www.example.com aaa bbb ccc"
.Objective-C: il modo migliore per estrarre la sottostringa da NSString?
Come posso estrarre la sottostringa @"http://www.example.com"
da esso?
Ho una stringa separata dallo spazio come @"abc xyz http://www.example.com aaa bbb ccc"
.Objective-C: il modo migliore per estrarre la sottostringa da NSString?
Come posso estrarre la sottostringa @"http://www.example.com"
da esso?
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.
Una possibile soluzione potrebbe essere l'utilizzo di espressioni regolari. Controlla RegexKit.
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 –
Punto ben preso. –
"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 –
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.
Prova questo:
[yourString substringToIndex:<#(NSUInteger)#>];
//or
[yourString substringFromIndex:<#(NSUInteger)#>];
//or
[yourString substringWithRange:<#(NSRange)#>];
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!
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;
}
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;
}
}
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.
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
Hmm ... NSArray * subStrings = [yourString componentsSeparatedByString: @ ""]; for (NSString * subString in subStrings) { if ([NSUrl URLWithString: subString]) { NSLog (@ "Questa sottostringa è un URL:% @", sottostringa); } } – Morion
Se le sottostringhe sono separate da @ "", nella console verranno visualizzate tutte le sottostringhe, ovvero URL corretti. – Morion