2013-01-13 2 views
1

UIWebView 객체에 일부 HTML 문자열을 표시해야하는 iOS 앱을 작성합니다. 검색을 시도하고 패턴을 찾아 이미지에 대한 적절한 링크로 대체하려고합니다. 이미지 링크는 [pic:brand:123]과 같은 원본입니다. pic은 항상 pic이고, brand은 영숫자 일 수 있으며, 123은 공백이 아닌 임의의 영숫자 일 수 있습니다. NSString 정규식 찾기 및 바꾸기

는 지금까지 포함한 몇 가지 시도 :

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]])\\]"; 

그러나 아무도 지금까지 근무하지 않았다.

NSString *str = @"veryLongHTMLSTRING"; 
NSLog(@"Original test: %@",[str substringToIndex:500]); 
NSError *error = nil; 
// use regular expression to replace the emoji 
NSRegularExpression *regex = [NSRegularExpression 
            regularExpressionWithPattern:@"\\[pic:([^\\s:\\]]+):([^\\]])\\]" 
            options:NSRegularExpressionCaseInsensitive error:&error]; 
if(error != nil){ 
    NSLog(@"ERror: %@",error); 
}else{ 
    [regex stringByReplacingMatchesInString:str 
            options:0 
             range:NSMakeRange(0, [str length]) 
           withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif", 
              IMAGE_BASE_URL, @"$1/$2"]]; 

NSLog(@"Replaced test: %@",[str substringToIndex:500]); 
+0

최종 결과는 무엇을 기대합니까? –

+0

나는 [pic : brand : 123]이'/ photo/brand/123.gif '가 될 것으로 기대한다. 상표는 여기에서 일반적이다. 그것은 여러 옵션 사이에 무엇이든간에 가능할 수 있습니다. – shawndreck

답변

8

내가 두 가지 오류를 참조하십시오 : 정규식 패턴의 두 번째 캡처 그룹에 누락 +있다, 그것은

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]"; 

그리고 stringByReplacingMatchesInString 반환해야 다음

은 샘플 코드 a 새 문자열, 일치하는 문자열을 바꿉니다. 따라서 새로운 문자열에 결과를 할당하거나 에 NSMutableString을 사용해야합니다.

다음 변형 한 코드

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]"; 
NSString *str = @"bla bla [pic:brand:123] bla bla"; 
NSLog(@"Original test: %@",str); 
NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression 
           regularExpressionWithPattern:pattern 
           options:NSRegularExpressionCaseInsensitive error:&error]; 
if(error != nil){ 
    NSLog(@"ERror: %@",error); 
} else{ 
    NSString *replaced = [regex stringByReplacingMatchesInString:str 
            options:0 
             range:NSMakeRange(0, [str length]) 
           withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif", 
              @"IMAGE_BASE_URL", @"$1/$2"]]; 

    NSLog(@"Replaced test: %@",replaced); 
} 

출력

Original test: bla bla [pic:brand:123] bla bla 
Replaced test: bla bla /IMAGE_BASE_URL/photo/brand/123.gif bla bla 
+0

당신은 절대적으로 옳습니다, 나는 내 눈을 과로로 사용하는 것을 멈출 필요가 있습니다! 고마워! – shawndreck

+0

@shawndreck 내 솔루션도 참조하십시오. :) –

+0

이것은 매우 매우 유용했다, 고마워. –

2

당신은 템플릿을 형성하는 방법을 오해하고를 생산하고 있습니다. 또한 stringByReplacingMatchesInString은 원래 문자열을 변경하지 않습니다. 시도해보십시오 (테스트 완료) :

NSString *target = @"longHTML [pic:whatever:123] longHTMLcontinues"; 
NSMutableString *s = [target mutableCopy]; 

NSError *err = nil; 
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:@"\\[pic\\:([a-zA-Z0-9]*)\\:([a-zA-Z0-9]*)\\]" options:0 error:&err]; 
if (err) { 
    NSLog(@"%@", err); 
    exit(-1); 
} 

[expr replaceMatchesInString:s options:0 range:NSMakeRange(0, s.length) withTemplate:@"/photo/$1/$2.gif"]; 
+0

감사합니다. 하지만 내가 템플릿과 혼동 스러울까요? 나는 [NSString stringWithFormat : ....을 사용해서는 안된다.? – shawndreck

+0

@shawndreck 아니요. 그럴 필요는 없습니다. 템플릿은 형식 자체입니다. '/ photo/$ 1/$ 2.gif'는'$ 1' 대신에 첫 번째 그룹을 대체 할 정규 표현식 객체를 알려줍니다. –

+0

stringWithFormat을 사용하는 이유는 이전에 정의 된 nsstring 상수'IMAGE_BASE_URL'를 포함 할 수 있기 때문입니다. 내 코드. '/ IMAGE_BASE_URL/photo/... '을 단순히 수행 할 수는 없기 때문에'IMAGE_BASE_URL'을 리터럴에 넣을 수 있습니다. 나는 분명히 내가 겪은 것이 아니다. 하지만 당신이 말한 것을 이해합니다. – shawndreck