Есть несколько различных способов удаления 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 [ >>>>>>>>>>>> ]]>
источник
Ответы:
Быстрое и «грязное» (удаляет все между <и>) решение, работает с iOS> = 3.2:
Я объявил это как категорию os NSString.
источник
Эта
NSString
категория используетNSXMLParser
для точного удаленияHTML
тегов из файлаNSString
. Это один.m
и.h
файл , который может быть включен в ваш проект легко.https://gist.github.com/leighmcculloch/1202238
Затем вы раздеваетесь
html
, выполнив следующие действия:Импортируйте заголовок:
А затем вызовите stripHtml:
Это также работает с уродливыми формами
HTML
, которых технически нетXML
.источник
отлично работает для меня
источник
Вы можете использовать, как показано ниже
источник
использовать это
не забудьте включить это в свой код: #import "RegexKitLite.h" вот ссылка для загрузки этого API: http://regexkit.sourceforge.net/#Downloads
источник
Взгляните на NSXMLParser. Это синтаксический анализатор в стиле SAX. Вы должны иметь возможность использовать его для обнаружения тегов или других нежелательных элементов в XML-документе и игнорировать их, захватывая только чистый текст.
источник
Вот более эффективное решение, чем принятый ответ:
Вышеупомянутая
NSString
категория использует регулярное выражение для поиска всех подходящих тегов, делает копию исходной строки и, наконец, удаляет все теги на месте, перебирая их в обратном порядке. Это более эффективно, потому что:Для меня это сработало достаточно хорошо, но решение с использованием
NSScanner
может быть более эффективным.Как и принятый ответ, это решение не касается всех пограничных случаев, запрошенных @lfalin. Это потребует гораздо более дорогостоящего синтаксического анализа, который, скорее всего, не понадобится для обычного варианта использования.
источник
Без петли (по крайней мере, с нашей стороны):
источник
источник
источник
Я расширил ответ m.kocikowski и попытался сделать его немного более эффективным, используя NSMutableString. Я также структурировал его для использования в статическом классе Utils (хотя я знаю, что категория, вероятно, лучший дизайн) и удалил автозапуск, чтобы он компилировался в проекте ARC.
Включено сюда на случай, если кому-то это пригодится.
.час
.m
источник
<(?>/?)(?!a).+?>
удалить все теги, за исключением открывающего тега <a> и закрывающего </a>.Если вы хотите получить контент без тегов html с веб-страницы (документа HTML), используйте этот код внутри метода
UIWebViewDidfinishLoading
делегата .источник
Я бы предположил, что самый безопасный способ - просто разобрать <> s, не так ли? Прокрутите всю строку и скопируйте все, что не заключено в <> s, в новую строку.
источник
Это модернизация ответа m.kocikowski, который удаляет пробелы:
источник
Ниже приводится принятый ответ, но вместо категории это простой вспомогательный метод со строкой, переданной в него. (спасибо m.kocikowski)
источник
Вот быстрая версия:
источник
stringByReplacingOccurrencesOfString
вы используете вне цикла, является процентным кодированием и должен быть исправлен правильным способом.Если вы хотите использовать платформу Three20 , у нее есть категория на NSString, которая добавляет метод stringByRemovingHTMLTags. См. NSStringAdditions.h в подпроекте Three20Core.
источник
Расширение этого еще из ответов m.kocikowski и Dan J с дополнительными объяснениями для новичков
1 # Сначала вам нужно создать объектные категории, чтобы код можно было использовать в любом классе.
.час
.m
2 # Затем просто импортируйте файл .h только что созданного класса категории, например
3 # Вызов метода.
Результатом является NSString, из которого я хочу удалить теги.
источник
Я следую принятому ответу m.kocikowski и немного изменил его, чтобы использовать автоматический выпуск для очистки всех временных строк, созданных stringByReplacingCharactersInRange
В комментарии к этому методу говорится: / * Заменить символы в диапазоне указанной строкой, возвращая новую строку. * /
Итак, в зависимости от длины вашего XML вы можете создать огромную кучу новых строк автозапуска, которые не очищаются до конца следующего @autoreleasepool. Если вы не уверены, когда это может произойти, или если действие пользователя могло многократно вызывать множество вызовов этого метода раньше, вы можете просто заключить это в @autoreleasepool. Они даже могут быть вложены и использоваться в циклах, где это возможно.
Ссылка Apple на @autoreleasepool гласит: «Если вы пишете цикл, который создает множество временных объектов. Вы можете использовать блок пула автозапуска внутри цикла, чтобы избавиться от этих объектов перед следующей итерацией. Использование блока пула автозапуска в цикле помогает уменьшить максимальный объем памяти, занимаемой приложением. " Я не использовал его в цикле, но, по крайней мере, теперь этот метод убирает за собой.
источник
Еще один способ:
Интерфейс:
-(NSString *) stringByStrippingHTML:(NSString*)inputString;
Реализация
Реализация
cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];
или просто
NSString *myClearStr = [self stringByStrippingHTML:rudeStr];
источник
Обновленный ответ для @ m.kocikowski, который работает в последних версиях iOS.
}
источник
Вот сообщение в блоге, в котором обсуждается пара библиотек, доступных для удаления HTML. Http://sugarmaplesoftware.com/25/strip-html-tags/ Обратите внимание на комментарии, в которых предлагаются другие решения.
источник