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使匹配不区分大小写。

虽然该示例使用文字Obama,但您显然可以动态构造字符串;但是在这种情况下要小心使用包含正则表达式元字符的字符串,它们需要被转义。

替换模板包含$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 回答