用许多尖括号清理弦

时间:2012-01-20 21:56:46

标签: regex tidy

我有以下一点HTML

<div class="article">this is a div article content</div>

由与divclassarticle相关的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>
  • 是的,输出来自Solr

更新:我接受了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;

}

1 个答案:

答案 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>

我相信你正在寻找的东西。

当尚未解析另一个标记时,代码基本上会丢弃所有标记。