2011-10-28 18 views
138

Sto cercando di verificare se una stringa che sto per utilizzare come URL inizia con http. Il modo in cui sto cercando di verificare adesso sembra non funzionare. Ecco il mio codice:Come verificare se una NSString inizia con una certa altra stringa?

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]; 

Qualche idea?

risposta

310

Prova questo: if ([myString hasPrefix:@"http"]).

A proposito, il test deve essere != NSNotFound anziché == NSNotFound. Ma dì che il tuo URL è ftp://my_http_host.com/thing, corrisponderà ma non dovrebbe.

+0

Yup che è stato. Avrei dovuto notare la cosa! = Prima, ma alla fine era l'hasPrefix a funzionare. Grazie per il consiglio, contrassegnerò la tua come risposta corretta non appena me lo consente. – Rob

22

mi piace usare questo metodo:

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

o ancora più semplice:

if ([temp hasPrefix:@"http"]) { 
    //do your stuff 
} 
+1

Anche questo è buono. In questo modo è un po 'più flessibile, grazie per il commento – Rob

+2

Questo si bloccherà se la stringa temporanea è inferiore a 5 caratteri. L'indice parte da 0. Quindi questa non è una buona risposta. Inoltre, l'esempio presenta una mancata corrispondenza del numero di caratteri: "http" non ha 5 caratteri. Dovrebbe essere presa in considerazione anche l'insensibilità al case. – Daniel

+0

@Daniel Cosa stai dicendo? Perché 5? Questo non è un NSArray ... L'indice 4 è il 4 ° personaggio, non il 5 °! E hai mai visto Http o hTtP? Maiuscole/minuscole non è rilevante. Inoltre, la domanda riguardava il controllo se la stringa inizia con http non riguardo alla stringa che è più corta di 4 caratteri. hasPrefix: è migliore ma funziona altrettanto bene. Stop whining – JonasG

5

Se stai controllando per "http:" probabilmente si vorrà ricerca case-insensitive:

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

Questa è la mia soluzione al problema. Rimuoverà le lettere che non sono necessarie e non fa distinzione tra maiuscole e minuscole.

- (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; 
} 
2

versione Swift:

if line.hasPrefix("#") { 
    // checks to see if a string (line) begins with the character "#" 
} 
+0

Non so perché questo è stato down-votato ... questo è il semplice modo rapido per farlo. La maggior parte dei nuovi sviluppatori iOS probabilmente useranno Swift da qui in avanti, e l'OP non ha mai detto che sono state richieste solo le risposte all'Obiettivo-C. – Richard

+0

"Non so perché questo è stato down-votato" - probabilmente perché la sintassi è sbagliata? Dovrebbe essere 'if line.hasPrefix (" prefix ")' {} ' –

+0

Grazie per aver evidenziato una sintassi più semplice, ma posizionare() attorno a un'istruzione if non è una sintassi sbagliata. Per alcuni di noi veterani, legge più chiaramente e funziona esattamente allo stesso modo. 'if (line.hasPrefix (" # ")) {}' funziona altrettanto bene. – Richard

Problemi correlati