[ios] iPhone의 NSString에서 HTML 태그 제거

제거하는 다른 몇 가지 방법이 있습니다 HTML tags에서 NSString에서가 Cocoa.

한 가지 방법 은 문자열을로 렌더링 NSAttributedString한 다음 렌더링 된 텍스트를 가져 오는 것입니다.

또 다른 방법NSXMLDocument'sobjectByApplyingXSLTString방법 을 사용 하여 XSLT변환 을 적용하는 것입니다.

불행히도 iPhone은 NSAttributedString또는 NSXMLDocument. HTML정규식 또는 .NET을 사용하는 것이 편안하다고 느끼기 에는 너무 많은 엣지 케이스와 잘못된 문서가 NSScanner있습니다. 누구든지 이것에 대한 해결책이 있습니까?

한 가지 제안은 여는 태그 문자와 닫는 태그 문자를 찾는 것이 었습니다.이 방법은 매우 사소한 경우를 제외하고는 작동하지 않습니다.

예를 들어 이러한 경우 (동일한 주제에 대한 Perl Cookbook 장에서 발췌)는이 방법을 손상시킵니다.

<IMG SRC = "foo.gif" ALT = "A > B">

<!-- <A comment> -->

<script>if (a<b && a>c)</script>

<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>



답변

빠르고 “더티”(<와> 사이의 모든 것을 제거) 솔루션은 iOS> = 3.2에서 작동합니다.

-(NSString *) stringByStrippingHTML {
  NSRange r;
  NSString *s = [[self copy] autorelease];
  while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
    s = [s stringByReplacingCharactersInRange:r withString:@""];
  return s;
}

나는 이것을 카테고리 os NSString으로 선언했습니다.


답변

NSString범주에는 사용 NSXMLParser정확히 어떤 제거 HTML에서 태그를 NSString. 이것은 싱글 .m.h쉽게 프로젝트에 포함 할 수있는 파일.

https://gist.github.com/leighmcculloch/1202238

그런 다음 다음 html을 수행하여 제거 합니다.

헤더를 가져옵니다.

#import "NSString_stripHtml.h"

그런 다음 stripHtml을 호출합니다.

NSString* mystring = @"<b>Hello</b> World!!";
NSString* stripped = [mystring stripHtml];
// stripped will be = Hello World!!

이것은 HTML기술적으로 그렇지 않은 잘못된 형식에서도 작동합니다 XML.


답변

UITextView *textview= [[UITextView alloc]initWithFrame:CGRectMake(10, 130, 250, 170)];
NSString *str = @"This is <font color='red'>simple</font>";
[textview setValue:str forKey:@"contentToHTMLString"];
textview.textAlignment = NSTextAlignmentLeft;
textview.editable = NO;
textview.font = [UIFont fontWithName:@"vardana" size:20.0];
[UIView addSubview:textview];

나를 위해 잘 작동


답변

아래와 같이 사용할 수 있습니다.

-(void)myMethod
 {

 NSString* htmlStr = @"<some>html</string>";
 NSString* strWithoutFormatting = [self stringByStrippingHTML:htmlStr];

 }

 -(NSString *)stringByStrippingHTML:(NSString*)str
 {
   NSRange r;
   while ((r = [str rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location     != NSNotFound)
  {
     str = [str stringByReplacingCharactersInRange:r withString:@""];
 }
  return str;
 }


답변

이것을 사용하십시오

NSString *myregex = @"<[^>]*>"; //regex to remove any html tag

NSString *htmlString = @"<html>bla bla</html>";
NSString *stringWithoutHTML = [hstmString stringByReplacingOccurrencesOfRegex:myregex withString:@""];

코드에 이것을 포함하는 것을 잊지 마십시오 : #import “RegexKitLite.h”여기에이 API를 다운로드 할 수있는 링크가 있습니다 : http://regexkit.sourceforge.net/#Downloads


답변

NSXMLParser를 살펴보십시오. SAX 스타일 파서입니다. XML 문서에서 태그 또는 기타 원치 않는 요소를 감지하고이를 무시하고 순수한 텍스트 만 캡처하는 데 사용할 수 있어야합니다.


답변

다음은 허용되는 답변보다 더 효율적인 솔루션입니다.

- (NSString*)hp_stringByRemovingTags
{
    static NSRegularExpression *regex = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        regex = [NSRegularExpression regularExpressionWithPattern:@"<[^>]+>" options:kNilOptions error:nil];
    });

    // Use reverse enumerator to delete characters without affecting indexes
    NSArray *matches =[regex matchesInString:self options:kNilOptions range:NSMakeRange(0, self.length)];
    NSEnumerator *enumerator = matches.reverseObjectEnumerator;

    NSTextCheckingResult *match = nil;
    NSMutableString *modifiedString = self.mutableCopy;
    while ((match = [enumerator nextObject]))
    {
        [modifiedString deleteCharactersInRange:match.range];
    }
    return modifiedString;
}

위의 NSString범주는 정규식을 사용하여 일치하는 모든 태그를 찾고, 원래 문자열의 복사본을 만들고, 마지막으로 역순으로 반복하여 모든 태그를 제자리에서 제거합니다. 다음과 같은 이유로 더 효율적입니다.

  • 정규식은 한 번만 초기화됩니다.
  • 원래 문자열의 단일 사본이 사용됩니다.

이것은 나를 위해 충분히 잘 수행되었지만 사용하는 솔루션 NSScanner이 더 효율적일 수 있습니다.

수락 된 답변과 마찬가지로이 솔루션은 @lfalin이 요청한 모든 경계 사례를 해결하지 않습니다. 평균 사용 사례에서는 필요하지 않은 훨씬 더 비싼 파싱이 필요합니다.