제거하는 다른 몇 가지 방법이 있습니다 HTML tags
에서 NSString
에서가 Cocoa
.
한 가지 방법 은 문자열을로 렌더링 NSAttributedString
한 다음 렌더링 된 텍스트를 가져 오는 것입니다.
또 다른 방법 은 NSXMLDocument's
– objectByApplyingXSLTString
방법 을 사용 하여 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이 요청한 모든 경계 사례를 해결하지 않습니다. 평균 사용 사례에서는 필요하지 않은 훨씬 더 비싼 파싱이 필요합니다.