RegEx:匹配HTML标记内不存在的特定字符串

时间:2010-03-03 02:38:01

标签: html regex

<tag value='botafogo'> botafogo is the best </tag>

只需要匹配botafogo(...是最好的)而不是'botafogo'值

我的程序在纯文本中自动“注释”该术语:

botafogo is the best 

to

<team attr='best'>botafogo</team> is the best 

当我“替换所有”“最佳”字样时,我有一个大问题......

<team attr='<adjective>best</adjective>'>botafogo</team> is the <adjective>best</adjective>

Ps。:Java语言

5 个答案:

答案 0 :(得分:5)

实现此目的的最佳方法是不使用正则表达式并使用正确的HTML解析器。 HTML不是常规语言,使用正则表达式执行此操作将非常繁琐,难以维护,并且可能仍然包含各种错误。

HTML解析器非常适合这项工作。其中许多都是成熟可靠的,它们会为您处理每一个细节,让您的生活更轻松。

答案 1 :(得分:4)

您是否考虑过使用DOM函数而不是正则表达式?

document.getElementsByTagName('tag')[0].innerHTML.match('botafogo')

答案 2 :(得分:1)

HTML解析器最好,然后循环浏览文本内容。 (见其他答案。)

如果您使用的是PHP,则可以通过在内容上运行strip_tags()来首先删除HTML,从而快速解决问题。这取决于你是否正在进行替换,在这种情况下,首先剥离不是一个选项,或者如果你只是匹配,在这种情况下,可以毫无顾虑地删除不属于匹配的内容。

答案 3 :(得分:0)

@OP,用您最喜欢的语言,在</tag>上进行拆分,然后在>上进行另一次拆分。例如Python

>>> s="<tag value='botafogo'> botafogo is the best </tag>"
>>> for item in s.split("</tag>"):
...  if "<tag" in item:
...      print item.split(">")[-1]
...
 botafogo is the best

不需要正则表达式

答案 4 :(得分:0)

我只是在寻找同一个任务的解决方案,并创建了一个似乎可以完成工作的解决方案。

Negative lookahead是关键。 要确保匹配不在标记内,请向前看,看到在开始之前找不到结束尖括号。假设,我们想找一个单词“needle”:

#needle(?![^<]+>)#i

我的案例是PHP,看起来像这样:

function filter_highlighter($content) {
    $patterns = array(
        '#needle(?![^<]+>)#i',
        '#<b>Need</b>le#',
        '#<strong>Need</strong>le#'
    );
    $replacement = '<span class="highlighted">Need</span>le';
    $content = preg_replace( $patterns, $replacement, $content);
    return $content;
}

到目前为止它的确有效。