正则表达式查找HTML标记之间包含的字符串

时间:2011-12-07 17:20:28

标签: html objective-c ios regex nsstring

我的问题是在包含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;
}

2 个答案:

答案 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表示包含我们的目标文本的第四个捕获组)替换字符串。