从NSString中删除HTML会导致问题

时间:2013-04-07 21:50:25

标签: html objective-c

我创建了一个RSS阅读器,我正在解析描述,但描述中有HTML标签,所以我用以下方法创建了一个NSString类别来清除标签:

- (NSString *)stripTags:(NSString *)str
{
NSMutableString *html = [NSMutableString stringWithCapacity:[str length]];

NSScanner *scanner = [NSScanner scannerWithString:str];
scanner.charactersToBeSkipped = NULL;
[scanner setCharactersToBeSkipped:nil];
NSString *tempText = nil;

while (![scanner isAtEnd])
{
    [scanner scanUpToString:@"<" intoString:&tempText];

    if (tempText != nil)
        [html appendString:tempText];

    [scanner scanUpToString:@">" intoString:NULL];

    if (![scanner isAtEnd])
        [scanner setScanLocation:[scanner scanLocation] + 1];

    tempText = nil;
}

return html;
}

这适用于删除HTML标记,这不是问题。问题是我的描述设置为最多100个字符,但它仍在计算该字符数中删除的HTML标记。所以有些描述根本没有显示,或者有些描述很短。我需要知道如何删除HTML标记,以便它们不会占用任何字符数。

如果您需要,我在这里设置我的描述:

NSString *dots;
int length = [self.description length];
if (length > 100)
{
    length = 100;
    dots = [NSString stringWithFormat:@"..."];
}
else
{
    dots = [NSString stringWithFormat:@""];
}

NSString *description = [NSString stringWithFormat:@"%@%@", [self.description substringToIndex:length], dots];

1 个答案:

答案 0 :(得分:1)

这似乎是因为您使用第一行从原始字符串设置字符串的容量。

NSMutableString *html = [NSMutableString stringWithCapacity:[str length]];

我认为这会设置最小容量大小,虽然它可以自由地增长,但它不能缩小到新的大小。

快速修复可能是将最初的长度设置为1或小于预期的最小文本。

示例:

NSMutableString *html = [NSMutableString stringWithCapacity:1];

你可以简单地使用:

NSMutableString *html = [[NSMutableString alloc] init];

我尝试使用此代码,它的工作原理与

完全相同
NSMutableString *html = [[NSMutableString alloc] init];
NSLog(@"Before: %u", [html length]);

NSScanner *scanner = [NSScanner scannerWithString:@"<a>this is a test</a>"];
scanner.charactersToBeSkipped = NULL;
[scanner setCharactersToBeSkipped:nil];
NSString *tempText = nil;

while (![scanner isAtEnd])
{
    [scanner scanUpToString:@"<" intoString:&tempText];

    if (tempText != nil)
        [html appendString:tempText];

    [scanner scanUpToString:@">" intoString:NULL];

    if (![scanner isAtEnd])
        [scanner setScanLocation:[scanner scanLocation] + 1];

    tempText = nil;
}

NSLog(@"After: %u", [html length]);