NSString删除html标记,保留<;尖括号中的文本>;

NSString删除html标记,保留<;尖括号中的文本>;,html,ios,objective-c,nsstring,Html,Ios,Objective C,Nsstring,如何从NSString中删除html标记,但保留任何 像123 abc->123 abc 我尝试过各种各样的regexp、scanner和XML解析器解决方案,但它们删除了以及标记 唯一适合我的解决方案是使用带有选项的NSAttribute字符串 NSAttributedString *str = [[NSAttributedString alloc] initWithData:utf8Data

如何从NSString中删除html标记,但保留任何

123 abc

->
123 abc

我尝试过各种各样的regexp、scanner和XML解析器解决方案,但它们删除了
以及标记

唯一适合我的解决方案是使用带有选项的NSAttribute字符串

NSAttributedString *str = [[NSAttributedString alloc] initWithData:utf8Data
                                                               options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                         NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
                                                    documentAttributes:nil
                                                                 error:nil];

NSString *result = [str string];
但是这种方法使用WebKit,并且为我的任务消耗了太多内存

那么,如何在不使用任何WebKit/UIWebView的情况下从NSString中剥离标记,保留
,等等?

我刚才问过ma,可能有些答案可以帮助您。 如果您确实需要完整的HTML解析器,并且只想去掉HTML标记,那么
NSString
类别可能会很有用(这是mwaterfal修改的类别):

-(NSString*)stringByStrippingTags{
//找到第一条&如果可以的话,找到捷径
NSUInteger ampIndex=[self rangeOfString:@',tag];
[tags addObject:t];
}
}而(![scanner isattend]);
NSMutableString*结果=[[NSMutableString alloc]initWithString:self];
NSString*最后一环;
NSString*替换;
for(标记中的NSString*t){
替换=@;
如果([t isEqualToString:@“”)||
[t isEqualToString:@']||
[t isEqualToString:@']||
[t isEqualToString:@']||
[t isEqualToString:@“”]||
[t isEqualToString:@“”]||
[t isEqualToString:@']||
[t isEqualToString:@”“){
替换=@;
}
[结果替换发生率字符串:t
带弦:替换
选项:NSLiteralSearch
范围:NSMakeRange(0,result.length)];
}
//删除多个空格和换行符
return=[result stringByRemovingNewLinesAndWhitespace];
}

尖括号中的文字是否始终相同?如果不是,您如何确定必须保留“尖括号中的文本”而不是“p”(例如)?换句话说,如何知道尖括号内的文本是否为标记?仅供参考-尖括号内的文本不是有效的HTML或有效的XML。
应该是
。否则就没有办法区分尖括号中的标签和文本。你可以用一个正则表达式来查找所有HTML标签,然后把它们去掉。像这样的
\]*\>
当然会匹配@Larme no,它不一样。我从CDATA中的web中获取它,作为所见即所得的用户输入。但是WebKit是如何与标记分离的呢?@rmaddy很好的提示,将挖掘它
- (NSString *)stringByStrippingTags {

    // Find first & and short-cut if we can
    NSUInteger ampIndex = [self rangeOfString:@"<" options:NSLiteralSearch].location;
    if (ampIndex == NSNotFound) {
        return [NSString stringWithString:self]; // return copy of string as no tags found
    }

    // Scan and find all tags
    NSScanner *scanner = [NSScanner scannerWithString:self];
    [scanner setCharactersToBeSkipped:nil];
    NSMutableSet *tags = [[NSMutableSet alloc] init];
    NSString *tag;
    do {
        // Scan up to <
        tag = nil;
        [scanner scanUpToString:@"<" intoString:NULL];
        [scanner scanUpToString:@">" intoString:&tag];

        if (tag) {
            NSString *t = [[NSString alloc] initWithFormat:@"%@>", tag];
            [tags addObject:t];
        }

    } while (![scanner isAtEnd]);
    NSMutableString *result = [[NSMutableString alloc] initWithString:self];
    NSString *finalString;

    NSString *replacement;
    for (NSString *t in tags) {
        replacement = @" ";
        if ([t isEqualToString:@"<a>"] ||
            [t isEqualToString:@"</a>"] ||
            [t isEqualToString:@"<span>"] ||
            [t isEqualToString:@"</span>"] ||
            [t isEqualToString:@"<strong>"] ||
            [t isEqualToString:@"</strong>"] ||
            [t isEqualToString:@"<em>"] ||
            [t isEqualToString:@"</em>"]) {
            replacement = @"";
        }
        [result replaceOccurrencesOfString:t
                            withString:replacement
                               options:NSLiteralSearch
                                 range:NSMakeRange(0, result.length)];
    }

    // Remove multi-spaces and line breaks
    return = [result stringByRemovingNewLinesAndWhitespace];
}