我的问题是在包含html文本的NSString中找到特定单词(例如: span )的位置,并替换此单词。
例如,如果我的目标字是 span ,我的替换文字应如下所示:
<SPAN style="BACKGROUND-COLOR: #FF0000">span</SPAN>
如果我的开头文字是:
<span class='i_04_12_000000'>this is a span</span>
我想要的结果是:
<span class='i_04_12_000000'>this is a <SPAN style="BACKGROUND-COLOR: #FF0000">span</SPAN></span>
显然,如果我只是搜索 span ,我就不会在html标签中找到它。 关于如何找到正确的字符串的想法,即使使用NSRange?
更新
这是最终解决方案:;)
+(NSString *)emphasizeString:(NSString *)stringToEmphasize inText:(NSString *)fullText
{
NSString * regExp = [NSString stringWithFormat:@"(?i)([\\s\\.,>'-])(%@)([\\s\\.,;!\\?\\)<])",stringToEmphasize];;
NSArray * regexResult = [fullText arrayOfCaptureComponentsMatchedByRegex:regExp];
NSString * result = [NSString stringWithString:fullText];
if([regexResult count] >0)
{
for (NSArray * match in regexResult)
{
NSString * all = [match objectAtIndex:0];
NSString * before = [match objectAtIndex:1];
NSString * matched = [match objectAtIndex:2];
NSString * after = [match objectAtIndex:3];
result = [result stringByReplacingOccurrencesOfString:all
withString:[NSString stringWithFormat:@"%@<SPAN style=\"BACKGROUND-COLOR: #FF0000\">%@</SPAN>%@",before, matched, after]
options:NSCaseInsensitiveSearch
range: [result rangeOfString:all]];
}
}
NSLog(@"%@",result);
return result;
}
答案 0 :(得分:1)
这是最终解决方案:;)
+(NSString *)emphasizeString:(NSString *)stringToEmphasize inText:(NSString *)fullText
{
NSString * regExp = [NSString stringWithFormat:@"(?i)([\\s\\.,>'-])(%@)([\\s\\.,;!\\?\\)<])",stringToEmphasize];;
NSArray * regexResult = [fullText arrayOfCaptureComponentsMatchedByRegex:regExp];
NSString * result = [NSString stringWithString:fullText];
if([regexResult count] >0)
{
for (NSArray * match in regexResult)
{
NSString * all = [match objectAtIndex:0];
NSString * before = [match objectAtIndex:1];
NSString * matched = [match objectAtIndex:2];
NSString * after = [match objectAtIndex:3];
result = [result stringByReplacingOccurrencesOfString:all
withString:[NSString stringWithFormat:@"%@<SPAN style=\"BACKGROUND-COLOR: #FF0000\">%@</SPAN>%@",before, matched, after]
options:NSCaseInsensitiveSearch
range: [result rangeOfString:all]];
}
}
NSLog(@"%@",result);
return result;
}
答案 1 :(得分:0)
尝试以下正则表达式:/<[a-z]+.*?>/
编辑:根据您的新说明进行更新:
由于您要捕获的文本前面的html标记具有可变数量的字符,因此您不能使用lookbehind仅抓取开头标记前面的目标字。但是,您可以使用:
/(<)([a-z]+)(.*?>.*?)(\2)(.*?</\1>)/
捕获整个标记,其标记的名称在其正文中的某处重复,并隔离捕获组中的那段文本。然后,使用替换方法将该正则表达式作为搜索模式,并使用"$1$2$3<span style=\"background-color: #FF0000;\">$4</span>$5"
(其中$ 4表示包含我们的目标文本的第四个捕获组)替换字符串。