Удалить HTML-теги из NSString на iPhone - PullRequest
104 голосов
/ 10 ноября 2008

Существует несколько способов удаления HTML tags из NSString в Cocoa.

Один из способов - преобразовать строку в NSAttributedString, а затем получить обработанный текст.

Другой способ - использовать метод NSXMLDocument's - objectByApplyingXSLTString для применения преобразования XSLT, которое это делает.

К сожалению, iPhone не поддерживает NSAttributedString или NSXMLDocument. Слишком много крайних случаев и искаженных документов HTML, чтобы я чувствовал себя комфортно, используя регулярные выражения или NSScanner. У кого-нибудь есть решение этого?

Одним из предложений было просто искать открывающие и закрывающие символы тега, этот метод не будет работать, за исключением очень тривиальных случаев.

Например, в этих случаях (из главы Perl Cookbook на ту же тему) этот метод будет нарушен:

<IMG SRC = "foo.gif" ALT = "A > B">

<!-- <A comment> -->

<script>if (a<b && a>c)</script>

<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>

Ответы [ 22 ]

307 голосов
/ 03 февраля 2011

Быстрое и «грязное» (удаляет все между <и>) решение, работает с iOS> = 3.2:

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

Я объявил это как категорию NSString.

29 голосов
/ 08 сентября 2011

Эта категория NSString использует NSXMLParser для точного удаления любых тегов HTML из NSString. Это единственный файл .m и .h, который можно легко включить в ваш проект.

https://gist.github.com/leighmcculloch/1202238

Затем вы снимаете html, выполняя следующее:

Импорт заголовка:

#import "NSString_stripHtml.h"

А затем вызовите stripHtml:

NSString* mystring = @"<b>Hello</b> World!!";
NSString* stripped = [mystring stripHtml];
// stripped will be = Hello World!!

Это также работает с искаженным HTML, который технически не XML.

10 голосов
/ 13 июня 2013
UITextView *textview= [[UITextView alloc]initWithFrame:CGRectMake(10, 130, 250, 170)];
NSString *str = @"This is <font color='red'>simple</font>";
[textview setValue:str forKey:@"contentToHTMLString"];
textview.textAlignment = NSTextAlignmentLeft;
textview.editable = NO;
textview.font = [UIFont fontWithName:@"vardana" size:20.0];
[UIView addSubview:textview];

отлично работает для меня

8 голосов
/ 12 ноября 2010

используйте это

NSString *myregex = @"<[^>]*>"; //regex to remove any html tag

NSString *htmlString = @"<html>bla bla</html>";
NSString *stringWithoutHTML = [hstmString stringByReplacingOccurrencesOfRegex:myregex withString:@""];

не забудьте включить это в свой код: #import "RegexKitLite.h" вот ссылка для загрузки этого API: http://regexkit.sourceforge.net/#Downloads

7 голосов
/ 10 ноября 2008

Посмотрите на NSXMLParser. Это синтаксический анализатор в стиле SAX. Вы должны иметь возможность использовать его для обнаружения тегов или других нежелательных элементов в XML-документе и игнорирования их, захватывая только чистый текст.

7 голосов
/ 10 октября 2013

Вы можете использовать как ниже

-(void)myMethod
 {

 NSString* htmlStr = @"<some>html</string>";
 NSString* strWithoutFormatting = [self stringByStrippingHTML:htmlStr];

 }

 -(NSString *)stringByStrippingHTML:(NSString*)str
 {
   NSRange r;
   while ((r = [str rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location     != NSNotFound)
  {
     str = [str stringByReplacingCharactersInRange:r withString:@""];
 }
  return str;
 }
6 голосов
/ 13 марта 2014

Вот более эффективное решение, чем принятый ответ:

- (NSString*)hp_stringByRemovingTags
{
    static NSRegularExpression *regex = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        regex = [NSRegularExpression regularExpressionWithPattern:@"<[^>]+>" options:kNilOptions error:nil];
    });

    // Use reverse enumerator to delete characters without affecting indexes
    NSArray *matches =[regex matchesInString:self options:kNilOptions range:NSMakeRange(0, self.length)];
    NSEnumerator *enumerator = matches.reverseObjectEnumerator;

    NSTextCheckingResult *match = nil;
    NSMutableString *modifiedString = self.mutableCopy;
    while ((match = [enumerator nextObject]))
    {
        [modifiedString deleteCharactersInRange:match.range];
    }
    return modifiedString;
}

Приведенная выше категория NSString использует регулярное выражение для поиска всех подходящих тегов, создает копию исходной строки и, наконец, удаляет все теги на месте, перебирая их в обратном порядке. Это более эффективно, потому что:

  • Регулярное выражение инициализируется только один раз.
  • Используется одна копия оригинальной строки.

Для меня это достаточно хорошо, но решение с использованием NSScanner может быть более эффективным.

Как и принятый ответ, это решение не охватывает все пограничные случаи, запрошенные @lfalin. Для этого потребуется гораздо более дорогой синтаксический анализ, который, скорее всего, в среднем случае использования не требуется.

5 голосов
/ 26 мая 2014

без петли (по крайней мере, на нашей стороне):

- (NSString *)removeHTML {

    static NSRegularExpression *regexp;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        regexp = [NSRegularExpression regularExpressionWithPattern:@"<[^>]+>" options:kNilOptions error:nil];
    });

    return [regexp stringByReplacingMatchesInString:self
                                            options:kNilOptions
                                              range:NSMakeRange(0, self.length)
                                       withTemplate:@""];
}
4 голосов
/ 12 августа 2011
#import "RegexKitLite.h"

string text = [html stringByReplacingOccurrencesOfRegex:@"<[^>]+>" withString:@""]
4 голосов
/ 23 марта 2015
NSAttributedString *str=[[NSAttributedString alloc] initWithData:[trimmedString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...