108

HTML tagsから削除するNSStringには、いくつかの異なる方法がありますCocoa

1つの方法は、文字列をにレンダリングしてからNSAttributedString、レンダリングされたテキストを取得することです。

もう1つの方法NSXMLDocument'sは、-methodを使用してそれを行う変換objectByApplyingXSLTStringを適用することです。XSLT

NSAttributedString残念ながら、iPhoneはまたはをサポートしていませんNSXMLDocumentHTML正規表現やを快適に使用するには、エッジケースや不正な形式のドキュメントが多すぎますNSScanner。誰かがこれに対する解決策を持っていますか?

1つの提案は、単に開始タグ文字と終了タグ文字を探すことでした。この方法は、非常に些細な場合を除いて機能しません。

たとえば、これらのケース(同じ主題に関するPerl Cookbookの章から)は、このメソッドを壊します:

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

<!-- <A comment> -->

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

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

22 に答える 22

310

迅速で「汚い」(<と>の間のすべてを削除する)ソリューションは、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のカテゴリとして宣言しました。

于 2011-02-03T13:56:53.850 に答える
29

このNSStringカテゴリは を使用して、からタグNSXMLParserを正確に削除します。これは、プロジェクトに簡単に含めることができる単一のファイルです。HTMLNSString.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ます。

于 2011-09-08T00:41:27.257 に答える
9

以下のように使用できます

-(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;
 }
于 2013-10-10T09:00:41.733 に答える
8

これを使って

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

于 2010-11-12T11:15:27.610 に答える
7

NSXMLParser を見てください。これは SAX スタイルのパーサーです。これを使用して、XML ドキュメント内のタグやその他の不要な要素を検出し、それらを無視して、純粋なテキストのみをキャプチャできるはずです。

于 2008-11-10T19:40:12.493 に答える
6

受け入れられた答えよりも効率的な解決策を次に示します。

- (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カテゴリは、正規表現を使用して一致するすべてのタグを検索し、元の文字列のコピーを作成し、最後にすべてのタグを逆の順序で反復処理して削除します。次の理由により、より効率的です。

  • 正規表現は一度だけ初期化されます。
  • 元の文字列の 1 つのコピーが使用されます。

これは私にとっては十分に機能しましたが、使用するソリューションのNSScanner方が効率的かもしれません。

受け入れられた回答と同様に、このソリューションは、@lfalin によって要求されたすべての境界ケースに対応しているわけではありません。これらは、平均的なユースケースではおそらく必要としない、はるかに高価な解析を必要とします。

于 2014-03-13T14:45:46.760 に答える
5
NSAttributedString *str=[[NSAttributedString alloc] initWithData:[trimmedString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
于 2015-03-23T09:41:43.163 に答える
4
#import "RegexKitLite.h"

string text = [html stringByReplacingOccurrencesOfRegex:@"<[^>]+>" withString:@""]
于 2011-08-12T00:43:37.250 に答える
3

Web ページ (HTML ドキュメント) から html タグなしでコンテンツを取得する場合は、UIWebViewDidfinishLoading デリゲートメソッド内でこのコードを使用します。

  NSString *myText = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"];
于 2009-10-05T10:13:15.767 に答える
3

m.kocikowski による回答を拡張し、NSMutableString を使用してもう少し効率的にしようとしました。また、静的な Utils クラスで使用できるように構造化し (Category がおそらく最適な設計であることはわかっています)、自動リリースを削除して ARC プロジェクトでコンパイルできるようにしました。

誰かが役に立つと思う場合に備えて、ここに含まれています。

.h

+ (NSString *)stringByStrippingHTML:(NSString *)inputString;

.m

+ (NSString *)stringByStrippingHTML:(NSString *)inputString 
{
  NSMutableString *outString;

  if (inputString)
  {
    outString = [[NSMutableString alloc] initWithString:inputString];

    if ([inputString length] > 0)
    {
      NSRange r;

      while ((r = [outString rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
      {
        [outString deleteCharactersInRange:r];
      }      
    }
  }

  return outString; 
}
于 2012-08-24T19:51:07.520 に答える
2

以下は受け入れられた回答ですが、カテゴリの代わりに、文字列が渡された単純なヘルパー メソッドです。(ありがとうm.kocikowski)

-(NSString *) stringByStrippingHTML:(NSString*)originalString {
    NSRange r;
    NSString *s = [originalString copy];
    while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
        s = [s stringByReplacingCharactersInRange:r withString:@""];
    return s;
}
于 2015-02-18T23:55:33.653 に答える
2

最も安全な方法は <> を解析することだと思いますよね?文字列全体をループし、<> で囲まれていないものを新しい文字列にコピーします。

于 2008-11-10T04:56:26.223 に答える
2

これは、空白を削除するm.kocikowskiの回答の最新化です。

@implementation NSString (StripXMLTags)

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

@end
于 2013-09-23T21:56:13.530 に答える
0

私は m.kocikowski によって受け入れられた回答に従っていますが、stringByReplaceingCharactersInRange によって作成されたすべての一時文字列をクリーンアップするために autoreleasepool を使用するように少し変更されています。

このメソッドのコメントでは、 /* 範囲内の文字を指定された文字列に置き換え、新しい文字列を返します。*/

そのため、XML の長さによっては、次の @autoreleasepool の終わりまでクリーンアップされない新しい autorelease 文字列の膨大な山が作成される場合があります。それがいつ発生するかわからない場合、またはユーザー アクションが以前にこのメソッドへの多くの呼び出しを繰り返しトリガーする可能性がある場合は、これを @autoreleasepool でラップすることができます。これらはネストして、可能な場合はループ内で使用することもできます。

@autoreleasepool に関する Apple のリファレンスには、次のように記載されています...アプリケーションの最大メモリ フットプリントを削減するのに役立ちます。」ループで使用したことはありませんが、少なくともこのメソッドは後でクリーンアップされます。

- (NSString *) stringByStrippingHTML {
    NSString *retVal;
    @autoreleasepool {
        NSRange r;
        NSString *s = [[self copy] autorelease];
        while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound) {
            s = [s stringByReplacingCharactersInRange:r withString:@""];
        }
        retVal = [s copy];
    } 
    // pool is drained, release s and all temp 
    // strings created by stringByReplacingCharactersInRange
    return retVal;
}
于 2015-04-22T18:56:46.597 に答える
0

Three20 フレームワークを使用する場合は、stringByRemovingHTMLTags メソッドを追加する NSString のカテゴリがあります。Three20Core サブプロジェクトの NSStringAdditions.h を参照してください。

于 2010-10-04T12:17:59.307 に答える
0

もう一つの方法:

インターフェース:

-(NSString *) stringByStrippingHTML:(NSString*)inputString;

実装

(NSString *) stringByStrippingHTML:(NSString*)inputString
{ 
NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:[inputString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil];
NSString *str= [attrString string]; 

//you can add here replacements as your needs:
    [str stringByReplacingOccurrencesOfString:@"[" withString:@""];
    [str stringByReplacingOccurrencesOfString:@"]" withString:@""];
    [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    return str;
}

実現

cell.exampleClass.text = [self stringByStrippingHTML:[exampleJSONParsingArray valueForKey: @"key"]];

または単純な

NSString *myClearStr = [self stringByStrippingHTML:rudeStr];

于 2016-01-27T10:35:31.783 に答える
0

これを m.kocikowski と Dan J の回答からさらに拡張し、初心者向けの説明を追加します

1# まず、どのクラスでもコードを使用できるようにするために、objective-c-categoriesを作成する必要があります。

.h

@interface NSString (NAME_OF_CATEGORY)

- (NSString *)stringByStrippingHTML;

@end

.m

@implementation NSString (NAME_OF_CATEGORY)

- (NSString *)stringByStrippingHTML
{
NSMutableString *outString;
NSString *inputString = self;

if (inputString)
{
    outString = [[NSMutableString alloc] initWithString:inputString];

    if ([inputString length] > 0)
    {
        NSRange r;

        while ((r = [outString rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
        {
            [outString deleteCharactersInRange:r];
        }
    }
}

return outString;
}

@end

2# 次に、作成したばかりのカテゴリ クラスの.hファイルをインポートします。

#import "NSString+NAME_OF_CATEGORY.h"

3# メソッドの呼び出し。

NSString* sub = [result stringByStrippingHTML];
NSLog(@"%@", sub);

結果はタグを削除したい NSString です。

于 2013-07-25T20:43:01.403 に答える
-3

HTML のストリッピングに使用できるいくつかのライブラリについて説明しているブログ投稿があります 。http://sugarmaplesoftware.com/25/strip-html-tags/

于 2008-11-13T18:02:48.233 に答える