Вот более эффективное решение, чем принятый ответ:
- (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. Для этого потребуется гораздо более дорогой синтаксический анализ, который, скорее всего, в среднем случае использования не требуется.