Используйте регулярные выражения для удаления тегов HTML во Flex / AS3 - PullRequest
1 голос
/ 26 сентября 2010

Я пишу анализатор HTML во Flex (AS3) и мне нужно удалить некоторые ненужные теги HTML.

Например, я хочу удалить элементы div из этого кода:

           <div>
              <div>
                <div>
                  <div>
                    <div>
                      <div>
                        <div>
                          <p style="padding-left: 18px; padding-right: 20px; text-align: center;">
                            <span></span>
                            <span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: bold; text-decoration: none; font-family: Arial;">20% OFF.</span>
                            <span> </span>
                            <span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: normal; text-decoration: none; font-family: Arial;">Do it NOW!</span>
                            <span> </span>
                          </p>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>

и заканчивайте примерно так:

                      <div>
                          <p style="padding-left: 18px; padding-right: 20px; text-align: center;">
                            <span></span>
                            <span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: bold; text-decoration: none; font-family: Arial;">20% OFF.</span>
                            <span> </span>
                            <span style=" font-size: 48px; color: #666666; font-style: normal; font-weight: normal; text-decoration: none; font-family: Arial;">Do it NOW!</span>
                            <span> </span>
                          </p>
                        </div>

Мой вопрос: как мне написать регулярное выражение для удаления этих нежелательных DIV?Есть ли лучший способ сделать это?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2010

Вы не можете сопоставить произвольно вложенные конструкции с регулярным выражением , потому что вложение означает неправильность.Парсер (который вы пишете) является правильным инструментом для этого.

Теперь в этом очень особом случае вы можете сделать

result = subject.replace(/^\s*(<\/?div>)(?:\s*\1)*(?=\s*\1)/mg, "");

(который просто удалит все непосредственно последующие вхождения<div> или </div> за исключением последнего), но это плохо во многих отношениях, и я боюсь, что это приведет меня к забвению.

Объяснить:

^           # match start of line
\s*         # match leading whitespace
(</?div>)   # match a <div> or </div>, remember which
(?:\s*\1)*  # match any further <div> or </div>, same one as before
(?=\s*\1)   # as long as there is another one right ahead

Можете ли вы сосчитать пути в этом, это потерпит неудачу?(Думайте комментарии, непревзойденные <div> с и т. Д.)

1 голос
/ 27 сентября 2010

Предполагая, что ваш целевой HTML на самом деле является действительным XML, вы можете использовать рекурсивную функцию для вытаскивания битов, не относящихся к div.

static function grabNonDivContents(xml:XML):XMLList {
    var out:XMLList = new XMLList();
    var kids:XMLList = xml.children();
    for each (var kid:XML in kids) {
        if (kid.name() && kid.name() == "div") {
            var grandkids:XMLList = grabNonDivContents(kid);
            for each (var grandkid:XML in grandkids) {
                out += grandKid;
            }
        } else {
            out += kid;
        }
    }
    return out;
}
0 голосов
/ 26 сентября 2010

По моему опыту, разбирать сложные html только с регулярными выражениями - это ад.Регексы быстро выходят из-под контроля.Гораздо надежнее извлекать нужные вам части информации (возможно, с помощью простых регулярных выражений) и собирать их обратно в более простой документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...