我有以下一点HTML
<div class="article">this is a div article content</div>
由与div
,class
和article
相关的HTML不可知程序“标记”,导致:
<<hl>div</hl> <hl>class</hl>="<hl>article</hl>">this is a <hl>div</hl> <hl>article</hl> content</<hl>div</hl>>
虽然我真正需要的是:
<div class="article">this is a <hl>div</hl> <hl>article</hl> content</div>
由于输出完全是垃圾(甚至像HTML Tidy
这样的工具会阻塞它),我认为正则表达式替换会帮助去除HTML中的额外<hl>
标记:
replace(/<([^>]*)<hl>([^<]*?)<\/hl>([^>]*?)>/g, '<$1$2$3>')
现在,这有效,但只替换了代码中的第一个,即div
:
<div <hl>class</hl>="<hl>article</hl>">this is a <hl>div</hl> <hl>article</hl> content</div>
我的问题是:如何替换代码中的所有 <hl>
,以确保HTML仍然有效?
附加说明:
class="article"
可以消失)<hl>
和</hl>
更新:我接受了jcollado的回答,但我在Javascript中需要这个。这是等效的代码:
var stripIllegalTags = function(html) {
var output = '',
dropChar,
parsingTag = false;
for (var i=0; i < html.length; i++) {
var character = html[i];
if (character == '<') {
if (parsingTag) {
do {
dropChar = html[i+1];
i++;
} while (dropChar != '>');
continue;
}
parsingTag = true;
} else if (character == '>') {
parsingTag = false;
}
output += character;
}
return output;
}
答案 0 :(得分:0)
下面的代码可能对您有所帮助:
class HTMLCleaner(object):
def parse(self, html):
output = []
parsing_tag = False
html = iter(html)
for char in html:
if char == '<':
if parsing_tag:
drop_char = html.next()
while drop_char != '>':
drop_char = html.next()
continue
parsing_tag = True
elif char == '>':
parsing_tag = False
output.append(char)
return ''.join(output)
html = '<<hl>div</hl> <hl>class</hl>="<hl>article</hl>">this is a <hl>div</hl> <hl>article</hl> content</<hl>div</hl>>'
parser = HTMLCleaner()
print parser.parse(html)
给定输入的输出是:
<div class="article">this is a <hl>div</hl> <hl>article</hl> content</div>
我相信你正在寻找的东西。
当尚未解析另一个标记时,代码基本上会丢弃所有标记。