Iphone 替换NSString中出现的字符串,同时保留原始字符串的大小写

Iphone 替换NSString中出现的字符串,同时保留原始字符串的大小写,iphone,objective-c,ios,nsstring,Iphone,Objective C,Ios,Nsstring,我使用UIWebview显示了一些本地HTML和CSS。我想合并搜索命中突出显示 以下是我的突出显示方法: -(void)highlightsSearchTerm:(NSString*)搜索术语 { NSString*highlightedSearchTerm=[NSString stringWithFormat:@“%@”,searchTerm]; NSString*highlightedArticle=[article.articleHTML StringByReplacingOfStrin

我使用UIWebview显示了一些本地HTML和CSS。我想合并搜索命中突出显示

以下是我的突出显示方法:

-(void)highlightsSearchTerm:(NSString*)搜索术语
{
NSString*highlightedSearchTerm=[NSString stringWithFormat:@“%@”,searchTerm];
NSString*highlightedArticle=[article.articleHTML StringByReplacingOfString:searchTerm with String:highlightedSearchTerm选项:NSCaseInSensitiveSearchRange:NSMakerRange(0,[article.articleHTML长度]);
article.articleHTML=高亮显示的文章;
}
这样做的问题是,它用用户的搜索查询替换了,例如,
Obama
,该查询可能是
Obama
(请注意案例)。我想在合并热门突出显示的同时保留原文章的案例

我希望有一个更优雅的解决方案,而不是手动查找每个命中术语的起始索引和结束索引,然后分别插入
和“”

基本上我想要的是:

+[NSString stringByWrappingExistingString:(NSString*)StringToRap with String:(NSString*)wrappingString选项:NSCaseInsensitiveCompare];
有什么想法吗?

在这里:

-(void)highlightsSearchTerm:(NSString*)搜索术语
{
NSString*openSpan=@;
NSString*closeSpan=@;
NSRange searchRange=NSMakeRange(0,article.articleHTML.length);
NSRange-foundRange;
NSString*highlightedArticle=article.articlethtml;
while(searchRange.location
您可以使用
NSRegularExpression
执行此操作(直接键入代码,检查错误):

NSRegularExpression*re=[NSRegularExpression regular expression with pattern:@“Obama”
选项:nsregularexpressioncase不敏感
错误:NULL];
NSString*output=[re stringByReplacingMatchesInString:inputString
选项:0
范围:NSMakeRange(0,inputString.length)
withTemplate:@“$0”];
正则表达式搜索字符串,
@“Obama”
,在本例中非常简单,因为您正在查找文本匹配;选项
options:NSRegularExpressionCaseInsensitive
使匹配不区分大小写

虽然示例使用了文本,但显然可以动态构造字符串但是在使用包含正则表达式元字符的字符串时要小心,它们需要转义


替换模板包含<代码> $0 < /代码>,它将被匹配的(确切地,如此保存的情况)取代。

出于好奇,你认为哪种方法更好?为什么:是你的还是我的?我喜欢我的,因为它远离正则表达式(也许不是一个远离正则表达式的好理由),但我喜欢你的,因为它简洁。@TRedman-“更好”有点主观。以上内容既简短又灵活——如果您需要,比如说,将所有出现的“green jelly”更改为“jelly(green)”,保留原始代码的大小写,那么代码也会同样简短。框架还有进一步优化的空间,例如,与一次进行一个替换相比,多个替换具有更大的优化空间。如果可以,通常使用更高级别的方法;只有在遇到性能问题时才能降低级别。你真的救了我,回答得真棒!
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>"];