2009-07-31 6 views
0

j'ai le texte suivantNSScanner Looping récupération des valeurs multiples

<select name="username"><option value="177"> Bob1 
       </option><option value="221"> Bob2 
       </option><option value="227"> Bob3 
       </option><option value="164"> Bob4 
       </option><option value="271"> Bob5 
       </option><option value="137"> Bob6 
       </option><option value="105"> Bob7 
       </option><option value="285"> Bob8 
       </option><option value="281"> Bob9 
       </option><option value="265"> Bob10 
       </option></select> 

Et je suis en train d'utiliser un NSScanner pour obtenir la valeur de l'option et le nom dans les balises d'options. Jusqu'à présent, j'ai le code suivant

for (int y = 1; y < 16; y++) { 
    NSScanner *scanner1 = [NSScanner scannerWithString:htmlsource]; 
    [scanner1 scanUpToString:[NSString stringWithFormat:@"<option value=\""] intoString:NULL]; 
    [scanner1 scanString:[NSString stringWithFormat:@"<option value=\""] intoString:NULL]; 
    [scanner1 scanUpToString:@"\"" intoString:&result]; 
    NSLog(@"%i",[scanner1 scanLocation]); 
    NSLog(result); 

    [scanner1 setScanLocation:([scanner1 scanLocation] - 18)]; 
    [scanner1 scanUpToString:[NSString stringWithFormat:@"<option value=\"%@\">",result] intoString:NULL]; 
    [scanner1 scanString:[NSString stringWithFormat:@"<option value=\"%@\">",result] intoString:NULL]; 
    [scanner1 scanUpToString:@"</option>" intoString:&result]; 
    //NSLog([NSString stringWithFormat:@"<option value=\"%@\">",result]); 
    NSLog(@"%i",[scanner1 scanLocation]); 
    NSLog(result); 

    } 

Cela fonctionne pour la première entrée seulement. Est-ce que je vais mal ou dois-je commencer le balayage là où il s'est arrêté, si oui, comment? Les résultats obtenus jusqu'à présent sont ..

2009-07-31 08:15:53.859 App1[1000:20b] 683 
2009-07-31 08:15:53.860 App1[1000:20b] 177 
2009-07-31 08:15:53.860 App1[1000:20b] 712 
2009-07-31 08:15:53.860 App1[1000:20b] Bob1 

2009-07-31 08:15:53.861 App1[1000:20b] 683 
2009-07-31 08:15:53.861 App1[1000:20b] 177 
2009-07-31 08:15:53.862 App1[1000:20b] 712 
2009-07-31 08:15:53.862 App1[1000:20b] Bob1 

Répondre

1

Il y a toujours RegexKitLite.

Cette version conserve l'espace blanc dans le <option>...</option>:

NSString *regex = @"(?si)<option\\s+value\\s*=\\s*\"([^\"]*)\"[^>]*>(.*?)</option>"; 
NSArray *htmlOptionsArray = [htmlsource arrayOfCaptureComponentsMatchedByRegex:regex]; 
for(NSArray *parsedOptionArray in htmlOptionsArray) { 
    NSString *value = [parsedOptionArray objectAtIndex:1UL]; 
    NSString *text = [parsedOptionArray objectAtIndex:2UL]; 
    NSLog(@"Value: '%@', text: '%@'", value, text); 
} 

Exemple de sortie:

2009-07-31 04:20:23.692 so[35423:807] Value: '177', text: ' Bob1 
       ' 
2009-07-31 04:20:23.699 so[35423:807] Value: '221', text: ' Bob2 
       ' 
.... 
2009-07-31 04:20:23.725 so[35423:807] Value: '281', text: ' Bob9 
       ' 
2009-07-31 04:20:23.726 so[35423:807] Value: '265', text: ' Bob10 
       ' 

Cette version se déshabille tout blanc d'espace autour du texte option:

NSString *regex = @"(?si)<option\\s+value\\s*=\\s*\"([^\"]*)\"[^>]*>\\s*(.*?)\\s*</option>"; 
NSArray *htmlOptionsArray = [htmlsource arrayOfCaptureComponentsMatchedByRegex:regex]; 
for(NSArray *parsedOptionArray in htmlOptionsArray) { 
    NSString *value = [parsedOptionArray objectAtIndex:1UL]; 
    NSString *text = [parsedOptionArray objectAtIndex:2UL]; 
    NSLog(@"Value: '%@', text: '%@'", value, text); 
} 

Exemple de sortie:

2009-07-31 04:21:50.352 so[35436:807] Value: '177', text: 'Bob1' 
2009-07-31 04:21:50.354 so[35436:807] Value: '221', text: 'Bob2' 
... 
2009-07-31 04:21:50.359 so[35436:807] Value: '281', text: 'Bob9' 
2009-07-31 04:21:50.359 so[35436:807] Value: '265', text: 'Bob10' 
0

Si elle est XML bien formé alors vous êtes probablement mieux à l'aide d'un analyseur XML comme NSXML pour faire le levage lourd pour vous:

NSXML

L'autre problème est que vous réinitialisez le scanner au début de la chaîne de valeur de l'option, donc lorsque vous re-scannez, vous commencez à partir de la même position que vous avez laissée à chaque fois. En fait, il ne s'agit pas de faire cela et de continuer?

[scanner1 setScanLocation:([scanner1 scanLocation] - 18)]; 

Si vous commentez cette ligne, commence-t-elle magiquement à fonctionner?

Questions connexes