Проверить, является ли 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
} 
Другие вопросы по тегам