3

UIWebview を使用して表示するローカルの HTML と CSS があります。検索ヒットの強調表示を組み込みたい。

これが私の強調表示方法です:

-(void) highlightsSearchTerm:(NSString *)searchTerm
{
    NSString *highlightedSearchTerm = [NSString stringWithFormat:@"<span class='highlight'>%@</span>",searchTerm];

    NSString *highlightedArticle = [article.articleHTML stringByReplacingOccurrencesOfString:searchTerm withString:highlightedSearchTerm options:NSCaseInsensitiveSearch range:NSMakeRange(0, [article.articleHTML length])];

    article.articleHTML = highlightedArticle;
}

これに関する問題は、たとえば、Obamaユーザーの検索クエリに置き換えられることですobama(ケースに注意してください)。ヒットハイライトを取り入れつつ、オリジナルのケースを維持したい。

各ヒット語の開始インデックスと終了インデックスを手動で見つけて、それぞれ '' と '' を挿入するよりも、より洗練されたソリューションを望んでいます<span class="highlights">

基本的に私は次のようなものが欲しい:

+ [NSString stringByWrappingExistingString:(NSString *)stringToWrap withString:(NSString *)wrappingString options:NSCaseInsensitiveCompare];

何かご意見は?

4

2 に答える 2

3

これを行うために使用できますNSRegularExpression(コードを直接入力し、エラーをチェックします):

NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:@"Obama" 
                                                                    options:NSRegularExpressionCaseInsensitive
                                                                      error:NULL];
NSString *output = [re stringByReplacingMatchesInString:inputString
                                                options:0
                                                  range:NSMakeRange(0, inputString.length)
                                           withTemplate:@"<span class='highlight'>$0</span>"];

@"Obama"この場合、リテラル一致を探しているので、正規表現の検索文字列は簡単です。このオプションoptions:NSRegularExpressionCaseInsensitiveを使用すると、一致で大文字と小文字が区別されなくなります。

この例ではリテラルのオバマを使用していますが、明らかに文字列を動的に作成できます。ただし、その場合、正規表現のメタ文字を含む文字列を使用する場合は注意が必要です。これらの文字列はエスケープする必要があります。

置換テンプレートには、$0一致したものに置換されるものが含まれています(正確には、ケースを保持します)。

于 2012-12-18T17:19:31.333 に答える
2

ここにあります:

-(void) highlightsSearchTerm:(NSString *)searchTerm
{
    NSString *openSpan = @"<span class='highlight'>";
    NSString *closeSpan = @"</span>";

    NSRange searchRange = NSMakeRange(0, article.articleHTML.length);
    NSRange foundRange;

    NSString *highlightedArticle = article.articleHTML;

    while (searchRange.location < highlightedArticle.length)
    {
        searchRange.length = highlightedArticle.length - searchRange.location;

        foundRange = [highlightedArticle rangeOfString:searchTerm options:NSCaseInsensitiveSearch range:searchRange];

        if (foundRange.location != NSNotFound)
        {
            // found an occurrence of the substring! do stuff here
            searchRange.location = foundRange.location + foundRange.length;

            NSString *casePreservedSearchQuery = [highlightedArticle substringWithRange:foundRange];
            NSString *styledSearchQuery = [NSString stringWithFormat:@"%@%@%@", openSpan, casePreservedSearchQuery, closeSpan];

            highlightedArticle = [highlightedArticle stringByReplacingCharactersInRange:foundRange withString:styledSearchQuery];

            //increase the current location by the length of new string - search query length
            searchRange.location = searchRange.location + [styledSearchQuery length] - [casePreservedSearchQuery length];
        }
        else
        {
            break;
        }
    }

    // no more substring to find
    article.articleHTML = highlightedArticle;
}
于 2012-12-18T16:58:04.427 に答える