Очистить строку с множеством угловых скобок - PullRequest
1 голос
/ 21 января 2012

У меня есть следующий бит HTML

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

, который «помечается» HTML-независимой программой на словах div, class и article, что приводит к:

<<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 подавляют его), я подумал, что замена регулярного выражения поможет удалить лишние <hl> s внутри тега HTML:

replace(/<([^>]*)<hl>([^<]*?)<\/hl>([^>]*?)>/g, '<$1$2$3>')

Теперь это работает, но только заменяет вхождение first в теге, то есть div:

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

У меня вопрос: как заменить все <hl> s внутри тега, чтобы убедиться, что 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 голосов
/ 21 января 2012

Может быть, фрагмент кода ниже полезен для вас:

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>

что я считаю, это то, что вы ищете.

Код в основном отбрасывает все теги, когда другой тег еще не проанализирован.

...