NSScanner Looping для извлечения нескольких значений - PullRequest
0 голосов
/ 31 июля 2009

У меня есть следующий текст

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

И я пытаюсь использовать NSScanner, чтобы получить значение параметра и имя в тегах параметра. Пока у меня есть следующий код

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

    }

Это работает только для первой записи. Я иду по этому поводу неправильно или я должен начать сканирование с того места, где оно было остановлено, и если да, то как? Результаты до сих пор ..

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

Ответы [ 2 ]

1 голос
/ 31 июля 2009

Всегда есть RegexKitLite .

Эта версия сохраняет пробел внутри <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);
}

Пример вывода:

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
                '

Эта версия удаляет лишние пробелы вокруг текста опции:

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);
}

Пример вывода:

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 голосов
/ 31 июля 2009

Если это правильно сформированный XML, то вам, вероятно, лучше использовать синтаксический анализатор XML, такой как NSXML, для выполнения тяжелой работы за вас:

NSXML

Другая проблема заключается в том, что вы сбрасываете сканер обратно в начало строки значения параметра, поэтому при повторном сканировании вы начинаете с той же позиции, которую вы каждый раз останавливали. Конечно, дело в том, чтобы не делать это и продолжать идти?

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

Если вы прокомментируете эту строку, она волшебным образом начнет работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...