<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语言
答案 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;
}
到目前为止它的确有效。