У меня огромный NSString
текст внутри HTML. Длина этой строки составляет более 3.500.000 символов. Как преобразовать этот HTML-текст в NSString
с помощью обычного текста внутри. Я использовал сканер, но он работает слишком медленно. Любая идея?
Преобразование текста HTML в обычный текст с помощью Objective-C
Ответ 1
Я решаю вопрос с помощью сканера, но я использую его не для всего текста. Я использую его для каждой части текста 10.000, прежде чем объединить все части вместе. Мой код ниже
-(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;
}
Свифт 4:
var htmlToString(html:String) -> String {
var htmlStr =html;
let scanner:Scanner = Scanner(string: htmlStr);
var text:NSString? = nil;
while scanner.isAtEnd == false {
scanner.scanUpTo("<", into: nil);
scanner.scanUpTo(">", into: &text);
htmlStr = htmlStr.replacingOccurrences(of: "\(text ?? "")>", with: "");
}
htmlStr = htmlStr.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines);
return htmlStr;
}
Ответ 2
Это зависит от того, на какую версию iOS вы ориентируетесь. Начиная с iOS7 существует встроенный метод, который не только удаляет теги HTML, но и помещает форматирование в строку:
Xcode 9/Swift 4
if let htmlStringData = htmlString.data(using: .utf8), let attributedString = try? NSAttributedString(data: htmlStringData, options: [.documentType : NSAttributedString.DocumentType.html], documentAttributes: nil) {
print(attributedString)
}
Вы даже можете создать расширение как это:
extension String {
var htmlToAttributedString: NSAttributedString? {
guard let data = self.data(using: .utf8) else {
return nil
}
do {
return try NSAttributedString(data: data, options: [.documentType : NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
} catch {
print("Cannot convert html string to attributed string: \(error)")
return nil
}
}
}
Обратите внимание, что в этом примере кода используется кодировка UTF8. Вы даже можете создать функцию вместо вычисляемого свойства и добавить кодировку в качестве параметра.
Свифт 3
let attributedString = try NSAttributedString(data: htmlString.dataUsingEncoding(NSUTF8StringEncoding)!,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
Objective-C
[[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
Если вам просто нужно удалить все между <
и >
(грязный путь !!!), что может быть проблематично, если у вас есть эти символы в строке, используйте это:
- (NSString *)stringByStrippingHTML {
NSRange r;
NSString *s = [[self copy] autorelease];
while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
s = [s stringByReplacingCharactersInRange:r withString:@""];
return s;
}
Ответ 3
Для языка Swift
NSAttributedString(data:(htmlString as! String).dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true
)!, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSNumber(unsignedLong: NSUTF8StringEncoding)], documentAttributes: nil, error: nil)!
Ответ 4
- (NSString *)stringByStrippingHTML:(NSString *)inputString
{
NSMutableString *outString;
if (inputString)
{
outString = [[NSMutableString alloc] initWithString:inputString];
if ([inputString length] > 0)
{
NSRange r;
while ((r = [outString rangeOfString:@"<[^>]+>| " options:NSRegularExpressionSearch]).location != NSNotFound)
{
[outString deleteCharactersInRange:r];
}
}
}
return outString;
}
Ответ 5
Цель С
+ (NSString*)textToHtml:(NSString*)htmlString
{
htmlString = [htmlString stringByReplacingOccurrencesOfString:@""" withString:@"\""];
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"'" withString:@"'"];
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<" withString:@"<"];
htmlString = [htmlString stringByReplacingOccurrencesOfString:@">" withString:@">"];
return htmlString;
}
Надеюсь это поможет!
Ответ 6
Вы попробовали что-то вроде этого ниже, Не уверен, что это будет быстрее, как вы делали до использования сканера, пожалуйста, проверьте: -
//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 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
Ответ 7
Swift 4:
do {
let cleanString = try NSAttributedString(data: htmlContent.data(using: String.Encoding.utf8)!,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
} catch {
print("Something went wrong")
}
Ответ 8
Он может быть более универсальным, передавая тип кодировки в качестве параметра, но в качестве примера такую категорию:
@implementation NSString (CSExtension)
- (NSString *)htmlToText {
return [NSAttributedString.alloc
initWithData:[self dataUsingEncoding:NSUnicodeStringEncoding]
options:@{NSDocumentTypeDocumentOption: NSHTMLTextDocumentType}
documentAttributes:nil error:nil].string;
}
@end