0

私はNSRegularExpressionを使用して、テキストを読み、ハッシュタグを見つけています。これは、regularExpressionWithPatternで使用したNSStringです。

- (NSString *)hashtagRegex
{
    return @"#((?:[A-Za-z0-9-_]*))";
    //return @"#{1}([A-Za-z0-9-_]{2,})";

}

そしてこれが私の方法です:

 // Handle Twitter Hashtags
  detector = [NSRegularExpression regularExpressionWithPattern:[self hashtagRegex] options:0 error:&error];
  links = [detector matchesInString:theText options:0 range:NSMakeRange(0, theText.length)];
  current = [NSMutableArray arrayWithArray:links];

    NSString *hashtagURL =   @"http://twitter.com/search?q=%23";
  //hashtagURL = [hashtagURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

  for ( int i = 0; i < [links count]; i++ ) {

    NSTextCheckingResult *cr = [current objectAtIndex:i];

    NSString *url = [theText substringWithRange:cr.range];

    NSString *nohashURL = [url stringByReplacingOccurrencesOfString:@"#" withString:@""];
    nohashURL = [nohashURL stringByReplacingOccurrencesOfString:@" " withString:@""];

    [theText replaceOccurrencesOfString:url 
                             withString:[NSString stringWithFormat:@"<a href=\"%@%@\">%@</a>", hashtagURL, nohashURL, url]
                                options:NSLiteralSearch 
                                  range:NSMakeRange(0, theText.length)];
    current = [NSMutableArray arrayWithArray:[detector matchesInString:theText options:0 range:NSMakeRange(0, theText.length)]];

  }

  [theText replaceOccurrencesOfString:@"\n" withString:@"<br />" options:NSLiteralSearch range:NSMakeRange(0, theText.length)];

  [_aWebView loadHTMLString:[self embedHTMLWithFontName:[self fontName] 
                                                   size:[self fontSize] 
                                                   text:theText]
                    baseURL:nil];

すべてが機能しましたが、次のような文字列を使用すると、小さな問題が発生しました。

NSString * theText = @"#twitter #twitterapp #twittertag";

私のコードは、各単語の#twitterのみを強調表示し、その2番目の部分は強調表示しません(#twitter #twitter(app)#twitter(tag))。誰かが私を助けてくれることを願っています!

ありがとうございました :)

4

1 に答える 1

0

ステートメント

[theText replaceOccurrencesOfString:url 
                         withString:[NSString stringWithFormat:@"<a href=\"%@%@\">%@</a>", hashtagURL, nohashURL, url]
                            options:NSLiteralSearch 
                              range:NSMakeRange(0, theText.length)];

文字列のすべてのインスタンスを置換url文字列に置き換えています。あなたが与える例では、ループを初めて通過するのurl@"#twitter"であり、その文字列の3つの出現すべてtheTextが一度に置き換えられます。これはtheText次のようになります。

<a href="http://twitter.com/search?q=%23twitter">#twitter</a> <a href="http://twitter.com/search?q=%23twitter">#twitter</a>app <a href="http://twitter.com/search?q=%23twitter">#twitter</a>tag

したがって、もちろん、次の 2 回のループでは、期待どおりの結果が得られません... !

修正は、置換の範囲を制限することだと思います:

[theText replaceOccurrencesOfString:url 
                         withString:[NSString stringWithFormat:@"<a href=\"%@%@\">%@</a>", hashtagURL, nohashURL, url]
                            options:NSLiteralSearch 
                              range:cr.range];
于 2012-12-01T00:29:18.793 に答える