如何在Objective C中将HTML字符串转换为格式化字符串



我使用以下代码,它只是消除了HTML标记,但没有格式化字符串。如何按照Html中显示的格式进行格式化。

-(NSString *)convertHTML:(NSString *)html {
    NSScanner *myScanner;
    NSString *text = nil;
    myScanner = [NSScanner scannerWithString:html];
    while ([myScanner isAtEnd] == NO) {
        [myScanner scanUpToString:@"<" intoString:NULL] ;
        [myScanner scanUpToString:@">" intoString:&text] ;
        html = [html stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>", text] withString:@""];
    }
    //
    html = [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    return html;
}

试试这个。这可能对有帮助

textview= [[UITextView alloc]initWithFrame:CGRectMake(10, 130, 250, 170)];
    NSString *str = [NSString stringWithFormat:@"<font color='red'>A</font><br/> shared photo of <font color='red'>B</font> with <font color='red'>C</font>, <font color='red'>D</font> "];
    [textview setValue:str forKey:@"contentToHTMLString"];
    textview.textAlignment = NSTextAlignmentLeft;
    textview.editable = NO;
    textview.font = [UIFont fontWithName:@"Verdana" size:20.0];

我建议使用第三方库https://github.com/mwaterfall/MWFeedParser/blob/master/Classes/NSString%2BHTML.m

然后像这样使用:

NSString *string = [@"<b>Your HTML String</b>" stringByConvertingHTMLToPlainText];

也许有更好的方法可以做到这一点,但以下是我的经验。1.扫描html字符串中的html标签2.为每个html标记创建属性字符串3.在字符串中查找标签的所有出现,并在属性字符串中对其应用属性。

这是我的样本代码,用于检测中断和粗体标签

//This method returns an array of occurrence of the tag in string
- (NSArray *)arrayOfStringFromString:(NSString *)string enclosedWithinString:(NSString *)stringOne andString:(NSString *)stringTwo{
    NSError *error = NULL;
    NSString *pattern =[NSString stringWithFormat:@"%@(.*?)%@",stringOne,stringTwo];
    NSRange range = NSMakeRange(0, string.length);
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
    NSArray *matches = [regex matchesInString:string options:NSMatchingReportProgress range:range];
    NSMutableArray *subStringArray = [NSMutableArray array];
    [matches enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isKindOfClass:[NSTextCheckingResult class]])
        {
            NSTextCheckingResult *match = (NSTextCheckingResult *)obj;
            NSRange matchRange = match.range;
            [subStringArray addObject:[string substringWithRange:matchRange]];
        }
    }];
    return subStringArray;
}
//This method returns the attributed string
- (NSMutableAttributedString*)attributedStringFromHTMLString:(NSString *)htmlString andFontSize:(float)size
{
    htmlString = [[self stringByDecodingXMLEntities:htmlString] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSArray *subStringArray = [self arrayOfStringFromString:htmlString enclosedWithinString:@"<b>" andString:@"</b>"];
    UIFont *lightFont = [UIFont fontWithName:@"HelveticaNeue-Light" size:size];
    UIFont *mediumFont = [UIFont fontWithName:@"HelveticaNeue-Medium" size:size];
    htmlString = [[[htmlString stringByReplacingOccurrencesOfString:@"<b>" withString:@""] stringByReplacingOccurrencesOfString:@"</b>" withString:@""] stringByReplacingOccurrencesOfString:@"<br>" withString:@"n"];
    NSArray *otherHtmlTags = [self arrayOfStringFromString:htmlString enclosedWithinString:@"<" andString:@">"];
    for (NSString *otherHtmlString in otherHtmlTags) {
        [htmlString stringByReplacingOccurrencesOfString:otherHtmlString withString:@""];
    }
    htmlString = [htmlString stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:htmlString attributes:@{NSFontAttributeName:lightFont}];
    for (NSString *string in subStringArray) {
        [attributedString addAttributes:@{NSFontAttributeName:mediumFont} range:[htmlString rangeOfString:string]];
    }
    return attributedString;
}
-(NSString *) stringByStrippingHTML {
  NSRange r;
  NSString *s = [[self copy] autorelease];
  while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
    s = [s stringByReplacingCharactersInRange:r withString:@""];
  return s;
}

使用这种方法,它对我的工作

NSAttributedString可以用HTML初始化,并且显示得很好。

如果要删除标记,则替换字符串中标记的代码将在O(n^2)中重复运行,也就是说,它将爬网大型字符串。您需要有一个可变的输出字符串,并根据需要向其添加位,以获得线性时间。

您可以查找"<"one_answers">"字符。然后,你需要找到你有哪些标签,因为对于一些标签,开始和结束标签之间的所有内容都必须删除,否则你会收到随机垃圾。

你需要以某种方式处理。

当你完成后,你需要更换所有的&使用正确字符转义序列。

最新更新