2

さて、私はウェブページを取得してテキストのパッセージに変換できるウェブクローラーに取り組んでいます。タグ自体を削除するには、スタック オーバーフローでこれを見つけました。

- (NSString *) stripTags:(NSString *)str
{
    NSMutableString *ms = [NSMutableString stringWithCapacity:[str length]];

    NSScanner *scanner = [NSScanner scannerWithString:str];
    [scanner setCharactersToBeSkipped:nil];
    NSString *s = nil;
    while (![scanner isAtEnd])
    {
        [scanner scanUpToString:@"<" intoString:&s];
        if (s != nil)
            [ms appendString:s];
        [scanner scanUpToString:@">" intoString:NULL];
        if (![scanner isAtEnd])
            [scanner setScanLocation:[scanner scanLocation]+1];
        s = nil;
    }

    return ms;
}

そしてそれは機能しますが、スクリプトタグとスタイルタグの間のコンテンツではなく、タグのみを削除します(空の文字列になるため、すべてのタグ間のコンテンツを削除したくないのは明らかです)。

特にスクリプトとスタイルのタグを切り詰める方法はありますか?

よろしくお願いします。

編集:

コードを次のように変更しようとしました:

- (NSString *) stripTags:(NSString *)str
{
    NSMutableString *ms = [NSMutableString stringWithCapacity:[str length]];

    NSScanner *scanner = [NSScanner scannerWithString:str];
    [scanner setCharactersToBeSkipped:nil];
    NSString *s = nil;
    while (![scanner isAtEnd])
    {
        [scanner scanUpToString:@"<script" intoString:&s];
        if (s != nil)
            [ms appendString:s];
        [scanner scanUpToString:@"script>" intoString:NULL];
        if (![scanner isAtEnd])
            [scanner setScanLocation:[scanner scanLocation]+1];
        [scanner scanUpToString:@"<" intoString:&s];
        if (s != nil)
            [ms appendString:s];
        [scanner scanUpToString:@">" intoString:NULL];
        if (![scanner isAtEnd])
            [scanner setScanLocation:[scanner scanLocation]+1];
        s = nil;
    }

    return ms;
}

ただし、スクリプトと css はまだ含まれています

4

1 に答える 1

1

タグを確認できるように、スキャナーコードを編集できます。タグを削除したい場合は、終了タグまでスキャンして文字列を破棄できます。その後、文字列を保存/追加することはできません。


タグの開始( <)'まで読んでからタグを読んで、それが何であるかを確認します。次に、タグを閉じるまで読み取り、ドロップするか保存します。


次のようなものから始めます(インラインで入力され、まったくテストされていません):

while (![scanner isAtEnd])
{
    [scanner scanUpToString:@"<" intoString:&s];
    if (s != nil)
        [ms appendString:s];
    [scanner scanUpToString:@">" intoString:&t];
    if ([t isEqualToString:@"tagToIgnore"]) {
        [scanner scanUpToString:@"<" intoString:NULL];
        [scanner setScanLocation:[scanner scanLocation]-1];
        s = nil;
        t = nil;
        continue;
    }
    if (![scanner isAtEnd])
        [scanner setScanLocation:[scanner scanLocation]+1];
    s = nil;
    t = nil;
}
于 2013-07-21T21:03:17.567 に答える