iPhone의 NS 문자열에서 HTML 태그 제거
제거하는 방법은 몇 가지가 있습니다.HTML tags
NSString
Cocoa
.
한 가지 방법은 문자열을 렌더링하는 것입니다.NSAttributedString
그런 다음 렌더링된 텍스트를 가져옵니다.
다른 방법은 사용하는 것입니다.NSXMLDocument's
-objectByApplyingXSLTString
을 XSLT
그것을 하는 변환.
은 지원하지 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
정확하게 제거하기 위해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!!
형식의 이는잘서작합다니동도식형에못된▁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(" ", withString: " ")
copy = copy.stringByReplacingOccurrencesOfString("&", 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
'source' 카테고리의 다른 글
NSTime 변환 방법간격(초)(분) (0) | 2023.06.01 |
---|---|
루비에서 배열을 해시로 변환하는 가장 좋은 방법은 무엇입니까? (0) | 2023.06.01 |
다른 모델에 정의된 몽구스 데이터베이스의 스키마를 가져오는 방법 (0) | 2023.06.01 |
장고에서 "선택" 필드 옵션을 올바르게 사용하는 방법 (0) | 2023.06.01 |
PostgreSQL: 명령줄에서 매개 변수를 전달하는 방법은 무엇입니까? (0) | 2023.06.01 |