source

iPhone의 NS 문자열에서 HTML 태그 제거

lovecheck 2023. 6. 1. 22:49
반응형

iPhone의 NS 문자열에서 HTML 태그 제거

제거하는 방법은 몇 가지가 있습니다.HTML tagsNSStringCocoa.

가지 방법은 문자열을 렌더링하는 것입니다.NSAttributedString그런 다음 렌더링된 텍스트를 가져옵니다.

다른 방법은 사용하는 것입니다.NSXMLDocument's-objectByApplyingXSLTStringXSLT그것을 하는 변환.

은 지원하지 NSAttributedString또는NSXMLDocument 형식이 경우가 있습니다.HTML 또는 정규식을 이 편안한 입니다.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;
}

저는 이것을 NSString의 범주로 선언했습니다.

것이.NSString카테고리는 다음을 사용합니다.NSXMLParser정확하게 제거하기 위해HTMLNSString 이은싱다니입입니다..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!!

형식의 이는잘서작합다니동도식형에못된▁mal▁with▁works다▁this와도 작동합니다.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이 요청한 모든 국경 사례를 해결하지는 않습니다.일반적인 사용 사례에서는 필요하지 않은 훨씬 더 많은 비용이 드는 구문 분석이 필요하지 않습니다.

루프 없이(적어도 우리 쪽에서):

- (NSString *)removeHTML {

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

    return [regexp stringByReplacingMatchesInString:self
                                            options:kNilOptions
                                              range:NSMakeRange(0, self.length)
                                       withTemplate:@""];
}
NSAttributedString *str=[[NSAttributedString alloc] initWithData:[trimmedString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
#import "RegexKitLite.h"

string text = [html stringByReplacingOccurrencesOfRegex:@"<[^>]+>" withString:@""]

저는 m.kocikowski로 답을 확장했고 NSMutableString을 사용하여 조금 더 효율적으로 하려고 노력했습니다.또한 정적 Utils 클래스에서 사용할 수 있도록 구성했으며(카테고리가 가장 좋은 설계인 것으로 알고 있음), ARC 프로젝트에서 컴파일되도록 자동 릴리스를 제거했습니다.

유용하다고 생각되는 사람이 있을 경우를 위해 여기에 포함됩니다.

.h

+ (NSString *)stringByStrippingHTML:(NSString *)inputString;

.m

+ (NSString *)stringByStrippingHTML:(NSString *)inputString 
{
  NSMutableString *outString;

  if (inputString)
  {
    outString = [[NSMutableString alloc] initWithString:inputString];

    if ([inputString length] > 0)
    {
      NSRange r;

      while ((r = [outString rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
      {
        [outString deleteCharactersInRange:r];
      }      
    }
  }

  return outString; 
}

문서 html 안에 이 코드를 합니다.UIWebViewDidfinishLoading 위임 방식

  NSString *myText = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"];

저는 가장 안전한 방법은 단지 <>s를 구문 분석하는 것이라고 생각합니다, 아닌가요?전체 문자열을 반복하고 <>s에 포함되지 않은 모든 문자열을 새 문자열로 복사합니다.

이것은 공백을 제거하는 m.kocikowski 답변의 현대화입니다.

@implementation NSString (StripXMLTags)

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

@end

빠른 버전은 다음과 같습니다.

func stripHTMLFromString(string: String) -> String {
  var copy = string
  while let range = copy.rangeOfString("<[^>]+>", options: .RegularExpressionSearch) {
    copy = copy.stringByReplacingCharactersInRange(range, withString: "")
  }
  copy = copy.stringByReplacingOccurrencesOfString("&nbsp;", withString: " ")
  copy = copy.stringByReplacingOccurrencesOfString("&amp;", withString: "&")
  return copy
}

다음은 허용된 답변이지만 범주 대신 문자열이 전달되는 간단한 도우미 메서드입니다.(코키코스키 씨 감사합니다)

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

Three20 프레임워크를 사용할 의향이 있다면 NSString에 stringByRemoving을 추가하는 범주가 있습니다.HTML 태그 메서드입니다.Three20Core 하위 프로젝트의 NSStringAdditions.h를 참조하십시오.

이것을 m.kocikowski와 Dan J의 답변에서 더 확장하고 새로운 사람들에 대한 더 많은 설명.

1# 먼저 목적-c-categories를 만들어 모든 클래스에서 코드를 사용할 수 있도록 해야 합니다.

.h

@interface NSString (NAME_OF_CATEGORY)

- (NSString *)stringByStrippingHTML;

@end

.m

@implementation NSString (NAME_OF_CATEGORY)

- (NSString *)stringByStrippingHTML
{
NSMutableString *outString;
NSString *inputString = self;

if (inputString)
{
    outString = [[NSMutableString alloc] initWithString:inputString];

    if ([inputString length] > 0)
    {
        NSRange r;

        while ((r = [outString rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
        {
            [outString deleteCharactersInRange:r];
        }
    }
}

return outString;
}

@end

2# 그런 다음 방금 만든 범주 클래스의 .h 파일을 가져오기만 하면 됩니다.

#import "NSString+NAME_OF_CATEGORY.h"

3# 메소드 호출.

NSString* sub = [result stringByStrippingHTML];
NSLog(@"%@", sub);

태그를 제거하려는 NSString 결과입니다.

나는 m.kocikowski의 수락된 답변을 따르고 있으며, stringByReplacingCharactersInRange에 의해 생성된 모든 임시 문자열을 정리하기 위해 자동 해제 풀을 사용하기 위해 약간 수정되었습니다.

이 메서드에 대한 설명에서 /* 범위의 문자를 지정된 문자열로 바꾸고 새 문자열을 반환합니다.*/

따라서 XML 길이에 따라 다음 @autorelease 풀이 끝날 때까지 정리되지 않는 새 자동 릴리스 문자열이 대량으로 생성될 수 있습니다.언제 이런 일이 발생할지 확실하지 않거나 사용자 작업이 이전에 이 메서드에 대한 많은 호출을 반복적으로 트리거할 수 있다면 @autorelease 풀에서 이 작업을 마무리하면 됩니다.가능한 경우 루프 내에서 중첩하여 사용할 수도 있습니다.

@autoreleasepool에 대한 Apple의 참조는 다음과 같습니다."만약 당신이 많은 일시적인 사물을 만드는 루프를 쓴다면.루프 내부의 자동 해제 풀 블록을 사용하여 다음 반복 전에 해당 개체를 삭제할 수 있습니다.루프에서 자동 릴리스 풀 블록을 사용하면 애플리케이션의 최대 메모리 공간을 줄일 수 있습니다."루프에서 사용한 적은 없지만, 적어도 이 방법은 이제 스스로 청소합니다.

- (NSString *) stringByStrippingHTML {
    NSString *retVal;
    @autoreleasepool {
        NSRange r;
        NSString *s = [[self copy] autorelease];
        while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound) {
            s = [s stringByReplacingCharactersInRange:r withString:@""];
        }
        retVal = [s copy];
    } 
    // pool is drained, release s and all temp 
    // strings created by stringByReplacingCharactersInRange
    return retVal;
}

다른 한 가지 방법:

인터페이스:

-(NSString *) stringByStrippingHTML:(NSString*)inputString;

실행

(NSString *) stringByStrippingHTML:(NSString*)inputString
{ 
NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];
NSString *str= [attrString string]; 

//you can add here replacements as your needs:
    [str stringByReplacingOccurrencesOfString:@"[" withString:@""];
    [str stringByReplacingOccurrencesOfString:@"]" withString:@""];
    [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    return str;
}

실현

cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];

아니면 단순한

NSString *myClearStr = [self stringByStrippingHTML:rudeStr];

최신 iOS 버전에서 작동하는 @m.kocikowski에 대한 업데이트된 답변입니다.

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

}

HTML을 삭제하는 데 사용할 수 있는 몇 가지 라이브러리에 대해 설명하는 블로그 게시물이 있습니다. http://sugarmaplesoftware.com/25/strip-html-tags/ 다른 솔루션이 제공되는 의견에 주목하십시오.

언급URL : https://stackoverflow.com/questions/277055/remove-html-tags-from-an-nsstring-on-the-iphone

반응형