2009-07-31 3 views
0

나는 다음과 같은 텍스트를NSScanner 루핑 검색 여러 개의 값은

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

    } 

이 항목은 첫 번째 항목으로 만 작동합니다. 내가 잘못했는지 아니면 중단했는지 스캔을 시작해야합니까? 그렇다면 어떻게해야합니까?

NSXML

: 결과는 지금까지 그 다음 XML을 잘 형성되어 있는지

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 

답변

1

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

예를 출력 :

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

이 버전은 옵션 텍스트 주위에 여분의 공백을 제거합니다

출력 예 :

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

당신이 당신을 위해 무거운 할 NSXML 같은 XML 파서를 개시 아마 더 좋을 것 같아 ..입니다 다른 문제는 옵션 값 문자열의 시작 부분으로 스캐너를 다시 설정하는 것이므로 다시 스캔 할 때마다 매번 중단 한 위치에서 시작한다는 것입니다. 확실하게 요점은 실제로 이것을하지 않으며, 계속하기위한 것입니까?

이 줄을 주석 처리하면 마술처럼 작동합니까?