【问题标题】:Regex to find string contained between HTML tags正则表达式查找包含在 HTML 标记之间的字符串
【发布时间】:2011-12-07 17:20:27
【问题描述】:

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

【问题讨论】:

  • 示例 html 字符串:这是一个跨度 结果:这是一个跨度
  • 您要查找的这些特定词是否被任何类型的标记包围,例如:&lt;span&gt;?
  • @Kappe 您应该发布您的解决方案作为您问题的答案。过两天就可以接受了。

标签: html objective-c ios regex nsstring


【解决方案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;
}

【讨论】:

    【解决方案2】:

    试试下面的正则表达式:/&lt;[a-z]+.*?&gt;/

    编辑:根据您的新说明进行更新:

    由于您要捕获的文本前面的 html 标记具有可变数量的字符,因此您不能使用lookbehind 仅抓取开头标记前面的目标单词。但是,您可以使用:

    /(&lt;)([a-z]+)(.*?&gt;.*?)(\2)(.*?&lt;/\1&gt;)/

    捕获整个标签,其中标签的名称在其正文文本中的某处重复,并将该文本片段隔离在捕获组中。然后,使用替换方法将该正则表达式作为搜索模式,并使用 "$1$2$3&lt;span style=\"background-color: #FF0000;\"&gt;$4&lt;/span&gt;$5"(其中 $4 表示包含我们的目标文本的第四个捕获组)作为替换字符串。

    【讨论】:

    • 这个模式只会定位&lt;span class='i_04_12_000000'&gt;而不是标签之间的span
    • @arcain 检查我编辑的帖子,看看它是否更符合您的要求。
    • 嗨亚伦,这个正则表达式似乎不起作用,我用我的解决方案更新了答案
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2017-12-20
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多