iOS NSMutableString Удалить теги ‹br›

У меня есть приложение для iPhone, и вот как я анализирую заголовки в RSS-канале с помощью NSXMLParser:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
        currentString = [[NSMutableString alloc] init];
        [self setTitle:currentString];
}

Это прекрасно работает. Теперь я имею дело с другим каналом, который содержит заголовки с тегами
, и я хочу их удалить. Я видел разные вопросы в StackOverflow, такие как ЭТО, который дает код для замены тегов
пустой строкой. Вот как я изменил свой код:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    currentString = [[NSMutableString alloc] init];
    currentString = [[currentString stringByReplacingOccurrencesOfString:@"<br>" withString:@""] mutableCopy];
    [self setTitle:currentString];
}

Но это не работает и показывает тот же текст на выходе без удаления тегов
. Может ли кто-нибудь указать, что я делаю неправильно и как я могу это исправить?


person AJ112    schedule 01.11.2013    source источник
comment
Что такое currentString здесь? Здесь вы инициализируете строку, а затем заменяете в ней ‹br›.   -  person Ramaraj T    schedule 01.11.2013
comment
@Suresh currentString — это NSMutableString.   -  person AJ112    schedule 01.11.2013
comment
@ AJ112 Мы догадались. Это не может быть ничем другим после того, как вы присвоите ему указатель на NSMutableString. Я думаю, что Суреш спрашивал какой-то контекст, например: 1. это переменная экземпляра или что? 2. Для чего он используется (или что он должен делать)? 3. что вы ожидаете на выходе, каков (ошибочный) вывод и 4. как это связано с этой переменной?   -  person    schedule 01.11.2013
comment
@ H2CO3 В моем файле .h я объявляю его как NSMutableString *currentString; а затем в файле .m я использую currentString для выделения и инициализации в каждом операторе if в didStartElement для получения разных тегов в rss-канале. Прямо сейчас он возвращает тот же результат без удаления тегов ‹br›, которые я хочу удалить.   -  person AJ112    schedule 01.11.2013
comment
@Suresh, проверьте мой ответ на H2CO3 выше   -  person AJ112    schedule 01.11.2013
comment
@ AJ112 AJ112 Рассматривали ли вы возможность использования replaceOccurrencesOfString:withString вместо перераспределения, повторной инициализации и копирования строки каждый раз?   -  person    schedule 01.11.2013
comment
@ H2CO3, я не понял, что ты только что сказал. Я думаю, что это то, что я делаю, беря currentString, используя stringByReplacingOccurrencesOFString withString   -  person AJ112    schedule 01.11.2013
comment
@ AJ112 replaceOccurrencesOfString:withString: не то же самое, что stringByReplacingOccurrencesOFString:withString:... Прочтите документацию NSMutableString.   -  person    schedule 01.11.2013
comment
Вы должны добавить больше своего кода, потому что в вашем примере вы просто заменяете ‹br› в пустой строке... Сразу после инициализации строка пуста, ей нечего будет заменить   -  person slecorne    schedule 01.11.2013
comment
@slecorne на самом деле возвращает вывод, но без удаления тегов br, так что это означает, что он не пустой   -  person AJ112    schedule 01.11.2013
comment
добавьте NSLog(@"%@", currentString) сразу после замены, по моему мнению, он должен быть пустым. Вы наверняка устанавливаете его с другим значением где-то еще   -  person slecorne    schedule 01.11.2013
comment
@H2CO3 попытался заменить OccurrencesOfString на String, используя этот вопрос > и не получилось. В соответствии с этим вопросом stringByReplacingOccurrencesOfString также должен работать, если я использую mutableCopy, который я уже использую. Так что оба не работают   -  person AJ112    schedule 01.11.2013
comment
@slecorne, если я использую NSLog, он дает пустую строку, но в симуляторе и устройстве он возвращает заголовок. Как вы сказали, я устанавливаю его где-то еще. В моем UITableViewController я устанавливаю его следующим образом, когда элемент является экземпляром этого класса. cell.titleLabel.text = [item title];   -  person AJ112    schedule 01.11.2013
comment
Поэтому переместите свой код, чтобы заменить ‹br› juste перед установкой заголовка ячейки. И вы можете удалить все бесполезные [[NSMutableString alloc] init]; в своем парсере   -  person slecorne    schedule 01.11.2013
comment
@slecorne я переместил код непосредственно перед установкой ячейки, и благодаря вам все сработало отлично. Пожалуйста, напишите это как ответ, чтобы я мог принять его.   -  person AJ112    schedule 01.11.2013


Ответы (1)


Я думаю, вам следует попробовать одну из этих функций, которая может быть вам полезна.

#pragma mark -
#pragma mark - Remove HTML Tags
- (NSString *)stringByStrippingHTML:(NSString *)inputString
{
    NSMutableString *outString = [[[NSMutableString alloc] initWithString:inputString] autorelease];

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

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

    return outString;
}

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

    NSScanner *scanner = [NSScanner scannerWithString:str];
    scanner.charactersToBeSkipped = NULL;
    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;
}
person D-eptdeveloper    schedule 01.11.2013
comment
да, я пробовал такой метод, но он ничем не отличается от stringByReplacingOccurrencesOfString, который я использую. Независимо от того, использую ли я stringByReplacingOccurrencesOfString или использую описанные вами методы, я получаю тот же результат - person AJ112; 01.11.2013