Comment voir si une NSString commence par une certaine autre chaîne?

152

J'essaie de vérifier si une chaîne que je vais utiliser comme URL commence par http. La façon dont j'essaie de vérifier en ce moment ne semble pas fonctionner. Voici mon code:

NSMutableString *temp = [[NSMutableString alloc] initWithString:@"http://"];
if ([businessWebsite rangeOfString:@"http"].location == NSNotFound){
    NSString *temp2 = [[NSString alloc] init];
    temp2 = businessWebsite;
    [temp appendString:temp2];
    businessWebsite = temp2;
    NSLog(@"Updated BusinessWebsite is: %@", businessWebsite);
}

[web setBusinessWebsiteUrl:businessWebsite];

Des idées?

Rob
la source

Réponses:

331

Essayez ceci: if ([myString hasPrefix:@"http"]).

Au fait, votre test devrait être != NSNotFoundau lieu de == NSNotFound. Mais dites que votre URL est ftp://my_http_host.com/thing, elle correspondra mais ne devrait pas.

Cyrille
la source
Ouais c'était ça. J'aurais dû remarquer la chose! = Avant, mais à la fin c'était le hasPrefix qui fonctionnait. Merci pour le conseil, je marquerai le vôtre comme la bonne réponse dès que cela me le permettra.
Rob
23

J'aime utiliser cette méthode:

if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
  //starts with http
}

ou encore plus simple:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}
JonasG
la source
1
C'est bien aussi. Cette façon est également un peu plus flexible, merci pour le commentaire
Rob
2
Cela plantera si la chaîne temporaire contient moins de 5 caractères. L'index commence à 0. Ce n'est donc pas une bonne réponse. En outre, l'exemple présente une incompatibilité de nombre de caractères: "http" ne contient pas 5 caractères. L'insensibilité à la casse doit également être envisagée.
Daniel
@Daniel Que dites-vous même? Pourquoi 5? Ce n'est pas un NSArray ... L'index 4 est le 4ème caractère pas le 5ème! Et avez-vous déjà vu Http ou hTtP? La sensibilité à la casse n'est pas pertinente. La question était également de vérifier si la chaîne commence par http et non de savoir si la chaîne est inférieure à 4 caractères. hasPrefix: c'est mieux mais cela fonctionne aussi bien. Arrêtez de pleurnicher
JonasG
3
@JonasG - Oui, vous avez raison sur le comportement de substringToIndex. Notez cependant que l'index 4 est en fait le 5e caractère; l'index 0 est le premier caractère. J'avais supposé à tort que substringToIndex comprend le caractère spécifié par l'index, mais ce n'est pas le cas. La sensibilité à la casse est pertinente lorsque la saisie de l'utilisateur est impliquée, ce à quoi je pense la question fait allusion. Prenons le cas de " HTTP: // WWW ...". Mais le plus gros problème est que la solution proposée lèvera une exception lorsqu'elle rencontrera "ftp" ou une chaîne de moins de 4 caractères. La méthode hasPrefix n'a pas le même problème.
Daniel
6

Si vous recherchez "http:", vous souhaiterez probablement une recherche insensible à la casse:

NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)
bobics
la source
2

Version Swift:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}
Richard
la source
Je ne sais pas pourquoi cela a été voté à la baisse ... c'est la façon simple de faire cela avec Swift. La plupart des nouveaux développeurs iOS vont probablement utiliser Swift à partir de maintenant, et l'OP n'a jamais dit que seules des réponses Objective-C étaient demandées.
Richard
«Je ne sais pas pourquoi cela a été voté à la baisse» - probablement parce que la syntaxe est incorrecte? Devrait être if line.hasPrefix("prefix"){} `
superarts.org
1
Merci d'avoir indiqué une syntaxe plus simple, mais placer () autour d'une instruction if n'est pas une mauvaise syntaxe. Pour certains d'entre nous, les anciens, cela se lit plus clairement et fonctionne exactement de la même manière. if (line.hasPrefix("#")) {}fonctionne aussi bien.
Richard
-1

C'est ma solution au problème. Il supprimera les lettres qui ne sont pas nécessaires et sont insensibles à la casse.

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self generateSectionTitles];
}

-(NSArray *)generateSectionTitles {

    NSArray *alphaArray = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];

    NSMutableArray *sectionArray = [[NSMutableArray alloc] init];

    for (NSString *character in alphaArray) {



        if ([self stringPrefix:character isInArray:self.depNameRows]) {
            [sectionArray addObject:character];
        }

    }

    return sectionArray;

}

-(BOOL)stringPrefix:(NSString *)prefix isInArray:(NSArray *)array {

    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:prefix options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return TRUE;
        }

    }

    return FALSE;

}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

    NSInteger newRow = [self indexForFirstChar:title inArray:self.depNameRows];
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
    [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

    return index;
}

// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
    NSUInteger count = 0;
    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:character options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return count;
        }
        count++;
    }
    return 0;
}
Hackmodford
la source