Convertir text HTML en text sin formatting utilizando Objective-C

Tengo un enorme NSString con text HTML dentro. La longitud de esta cadena es más de 3.500.000 caracteres. ¿Cómo puedo convertir este text HTML a NSString con text sin formatting dentro. Estaba usando el escáner, pero funciona muy lentamente. Alguna idea ?

Depende de la versión de iOS a la que te diriges. Desde iOS7 hay un método integrado que no solo eliminará las tags HTML, sino que también colocará el formatting en la cadena:

C objective

 [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil]; 

Rápido

 let attributedString = try NSAttributedString(data: htmlString.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) 

Si solo necesita eliminar todo entre < y > (¡sucio!), Lo que podría ser problemático si tiene estos caracteres en la cadena, use esto:

 - (NSString *)stringByStrippingHTML { NSRange r; NSString *s = [[self copy] autorelease]; while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound) s = [s stringByReplacingCharactersInRange:r withString:@""]; return s; } 

Resuelvo mi pregunta con el escáner, pero no lo uso para todo el text. Lo uso por cada 10.000 partes de text, antes de concatenar todas las partes juntas. Mi codigo a continuacion

 -(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; } 

Para el lenguaje Swift,

 NSAttributedString(data:(htmlString as! String).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true )!, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSNumber(unsignedLong: NSUTF8StringEncoding)], documentAttributes: nil, error: nil)! 
 - (NSString *)stringByStrippingHTML:(NSString *)inputString { NSMutableString *outString; if (inputString) { outString = [[NSMutableString alloc] initWithString:inputString]; if ([inputString length] > 0) { NSRange r; while ((r = [outString rangeOfString:@"<[^>]+>|&nbsp;" options:NSRegularExpressionSearch]).location != NSNotFound) { [outString deleteCharactersInRange:r]; } } } return outString; } 

¿Probaste algo parecido a continuación? No estoy seguro de si será más rápido como lo hiciste antes de usar el escáner. Comtesting:

 //String which contains html tags NSString *htmlString=[NSString stringWithFormat:@"%@",@"<b>right</b> onto <b>Kennington Park Rd/A3</b>Continue to follow A3</div><div >Entering toll zone in 1.7&nbsp;km at Newington Causeway/A3</div><divGo through 2 roundabouts</div>"]; NSMutableString *mutStr=[NSMutableString string]; NSString *s = nil; //Removing html elements tags NSArray *arra=[htmlString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"</>"]]; NSLog(@"%@",arra); for (s in arra) { [mutStr appendString:@" "]; [mutStr appendString:s]; } NSLog(@"%@",mutStr);//Printing the output