J'ai une chaîne séparée par des espaces, comme @"abc xyz http://www.example.com aaa bbb ccc"
.
Comment puis-je en extraire la sous-chaîne @"http://www.example.com"
?
Je sais que c'est une réponse très tardive, mais vous pouvez obtenir la sous-chaîne "http://www.abc.com" avec le code suivant:
[@"abc xyz http://www.abc.com aaa bbb ccc" substringWithRange:NSMakeRange(8, 18)]
Bien sûr, vous pouvez toujours utiliser une NSString
pour cela.
Essaye ça:
[yourString substringToIndex:<#(NSUInteger)#>];
//or
[yourString substringFromIndex:<#(NSUInteger)#>];
//or
[yourString substringWithRange:<#(NSRange)#>];
Si toutes vos sous-chaînes sont séparées par des espaces, vous pouvez essayer d'obtenir un tableau de sous-chaînes à l'aide de [myString componentsSeparatedByString:@" "]
. Ensuite, vous pouvez vérifier le résultat de [NSUrl URLWithString:yourSubstring]
. Il retournera nil si la sous-chaîne n'est pas un lien correct.
Voici ma version du script ... Espérons que ce soit propre et facile à implémenter . Il fait une partie des caractères basée sur des limites ... Mine est utilisé pour une zone de texte, mais peut évidemment être adapté aux champs de texte :)
-(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;
}
}
Cela peut aussi essayer de résoudre ce problème:
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]);
}
J'espère que ça aide!
Je trouve la substr()
de PHP vraiment pratique. Regarde ma catégorie NSString si tu cherches à faire quelque chose comme ça:
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12)
ou
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18)
Les deux vous donneront le résultat de http://www.example.com
Voici une copie du code correspondant:
__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;
}
Une solution possible pourrait utiliser des expressions régulières. Départ RegexKit .
Si votre chaîne d'entrée a des garanties simples (par exemple, la garantie que les jetons de la chaîne sont toujours délimités par un caractère d'espacement), divisez le caractère d'espacement et testez chaque élément pour @"http://"
comme préfixe.
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!
}
}
Ceci peut être optimisé en fonction des besoins de l'application. Par exemple, choisissez de court-circuiter la boucle une fois l'élément trouvé ou utilisez des filtres dans BlocksKit pour obtenir uniquement les éléments commençant par le préfixe. Une solution idéale dépend de la nature de la chaîne d'entrée et de ce que vous essayez d'accomplir avec.