用文本属性替换HTML标记

时间:2013-05-07 19:02:59

标签: objective-c cocoa nsstring html-parsing

我从Web服务获取数据,结果包含一些HTML标记,然后我尝试转换。例如,我想将<P>标记替换为换行符,将<STRONG>替换为HTML格式的粗体文本。

任何人都可以帮助我吗?我已经解决了如何替换文本的问题 - 我认为我已经到了一半了。

 if([key isEqualToString:@"Description"]){
            txtDesc.text=[results objectForKey:key];
            NSString * a = txtDesc.text;

            NSString * b = [a stringByReplacingOccurrencesOfString:@"<strong>" withString:@"STRONG TAG"];
            b =  [b stringByReplacingOccurrencesOfString:@"<\\/p>" withString:@""];
            b =  [b stringByReplacingOccurrencesOfString:@"</p>" withString:@""];

            txtDesc.text=b;

        }

2 个答案:

答案 0 :(得分:4)

字符串没有粗体等属性。字符串仅包含字符串,包括断路器。如果要使用属性丰富字符串,请查看NSAttributedString。

更新: 对于我们这些无法看到的人,为什么属性字符串是解决方案,只需一段简单的代码:

- (NSAttributedString*)attributedStringByReplaceHtmlTag:(NSString*)tagName withAttributes:(NSDictionary*)attributes
{
    NSString *openTag = [NSString stringWithFormat:@"<%@>", tagName];
    NSString *closeTag = [NSString stringWithFormat:@"</%@>", tagName];
    NSMutableAttributedString *resultingText = [self mutableCopy];
    while ( YES )   {
        NSString *plainString = [resultingText string];
        NSRange openTagRange = [plainString rangeOfString:openTag];
        if (openTagRange.length==0) {
            break;
        }

        NSRange searchRange;
        searchRange.location = openTagRange.location+openTagRange.length;
        searchRange.length = [plainString length]-searchRange.location;
        NSRange closeTagRange = [plainString rangeOfString:closeTag options:0 range:searchRange];

        NSRange effectedRange;
        effectedRange.location = openTagRange.location+openTagRange.length;
        effectedRange.length = closeTagRange.location - effectedRange.location;

        [resultingText setAttributes:attributes range:effectedRange];
        [resultingText deleteCharactersInRange:closeTagRange];
        [resultingText deleteCharactersInRange:openTagRange];

    }

    return resultingText;
}

但是我没有很好地测试它,因为我必须在编程时准备一份意大利调味饭。 ; - )

答案 1 :(得分:0)

如前所述,您需要使用NSAttributedString

它实现了以下方法,您将传递属性的NSDictionary和范围(characteres)以接收属性

- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)range;

NSDictionary的一个例子是:

@{ NSFontAttributeName: [UIFont systemFontOfSyze:24], NSForegroundColorAttributeName: [UIColor greenColor]}

您可以查找有关Apple文档的更多信息 https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/Reference/Reference.html

或斯坦福大学惊人的 iPhone应用程序开发课程的第4讲 http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2013-winter