Проверить, является ли NSString строкой html?
Я создаю приложение, которое должно отображать список строк, строка возвращается с сервера и может быть либо HTML, либо нет. В настоящее время я устанавливаю текст внутри UILabel. Для этого я использую ниже
NSMutableAttributedString *attributedTitleString = [[NSMutableAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
cell.label.attributedText =attributedTitleString;
Когда текст HTML, все работает отлично, так как шрифт и выравнивания возвращаются внутри HTML. Проблема возникает, когда текст является обычным текстом. Шрифт, выравнивание текста, размер текста и другие больше не соблюдаются.
Итак, как я могу проверить, является ли текст HTML-строкой или нет? Я буду использовать следующее в случае нормального текста:
cell.label.text =title;
Я пытался искать на форумах, но до сих пор не получил ответа на свой вопрос.
3 ответа
Это работает нормально, вам нужно поставить:
cell.label. attributedText = title;
в случае нормального текста тоже.
Как это работает нормально. Запустите приведенный ниже код.
// Если текст HTML
NSString *htmlstr = `@"This is <font color='red'>simple</font>"`;
NSMutableAttributedString *attributedTitleString = [[NSMutableAttributedString alloc] initWithData:[htmlstr dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
textField.attributedText =attributedTitleString;
textField.font = [UIFont fontWithName:@"vardana" size:20.0];
// Если обычный текст.
NSString *normalStr = @"This is Renuka";
NSMutableAttributedString *NorAttributedTitleString = [[NSMutableAttributedString alloc] initWithData:[normalStr dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
textField.attributedText = NorAttributedTitleString;
textField.font = [UIFont fontWithName:@"vardana" size:20.0];
Вы можете проверить, содержит ли ваша строка тег HTML:
// iOS8 +
NSString *string = @"<TAG>bla bla bla html</TAG>";
if ([string containsString:@"<TAG"]) {
NSLog(@"html string");
} else {
NSLog(@"no html string");
}
// iOS7 +
NSString *string = @"<TAG>bla bla bla html</TAG>";
if ([string rangeOfString:@"<TAG"].location != NSNotFound) {
NSLog(@"html string");
} else {
NSLog(@"no html string");
}
Поскольку синтаксис и структура HTML и XML очень похожи, вы можете использовать XMLDocument
проверить, является ли данный объект данных HTML или простым текстом.
Так что данные из типа Data
и возвращается URLSession
dataTask.
// Default to plain text
var options : [NSAttributedString.DocumentReadingOptionKey: Any] = [.documentType: NSAttributedString.DocumentType.plain]
// This will succeed for HTML, but not for plain text
if let _ = try? XMLDocument(data: data, options: []) {
options[.documentType] = NSAttributedString.DocumentType.html
}
guard let string = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else { return }
Обновить
Вышеуказанный метод работает вроде. У меня были проблемы с некоторыми HTML, не создавая XML-документ. На данный момент у меня есть другое решение, которое мне не очень нравится. Поскольку симптом заключается в том, что мы получаем только одну строку в атрибутивной строке, просто проверьте это и создайте новую атрибутивную строку, если есть только одна строка.
var options : [NSAttributedString.DocumentReadingOptionKey: Any] = [.documentType: NSAttributedString.DocumentType.html]
guard var string = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else { return }
if string.string.split(separator: "\n").count == 1 {
options[.documentType] = NSAttributedString.DocumentType.plain
guard let tempString = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else { return }
string = tempString
}