我使用以下代码,它只是消除了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">"字符。然后,你需要找到你有哪些标签,因为对于一些标签,开始和结束标签之间的所有内容都必须删除,否则你会收到随机垃圾。
你需要以某种方式处理。
当你完成后,你需要更换所有的&使用正确字符转义序列。