Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   RegExp выражение (https://javascript.ru/forum/misc/12513-regexp-vyrazhenie.html)

Wyfinger 21.10.2010 10:55

RegExp выражение
 
Подскажите пожалуйста как составить следующую регулярку:
Вырезать тег целиком с учетом вложенности например:
<div class="c1">text1<div class="c2">text2<div class="c3">text3</div></div></div>
Нужно вырезать (replace) тег <div class="c2"> с содержымым, т.е. остаться должно:
<div class="c1">text1</div>

Kolyaj 21.10.2010 10:59

Одними регулярками тут не обойтись.

Wyfinger 21.10.2010 11:07

Вы уверены?
Если не регуляркой - то как?

Kolyaj 21.10.2010 11:17

Ну вот как-то так, например.

var str = '<div class="c1">text1<div class="c2">text2<div class="c3">text3</div></div></div>';
var level = 0, inside = false;
alert(str.replace(/<\/?div[^>]*>|[^<]+/g, function(tag) {
    if (inside) {
        if (tag.indexOf('<div') == 0) {
            level++;
        } else if (tag == '</div>') {
            if (level) {
                level--;
            } else {
                inside = false;
            }
        }
        return '';
    } else {
        if (tag == '<div class="c2">') {
            inside = true;
            return '';
        } else {
            return tag;
        }
    }
}));

Wyfinger 21.10.2010 11:20

Вообще с регулярками все как-то сложно.
Не могу даже просто выдрать тег:
<table.*class.*=.*["']text_adv["'].*>[\s\S]*<\/table>


не работает (пример в редакторе)

Kolyaj 21.10.2010 11:26

Почитайте про жадность квантификаторов.

рони 21.10.2010 12:22

Вариант без регулярок
var str = '<div class="c1">text1<div class="c2">text2<div class="c3">text3</div></div></div>';
var div =  document.createElement('div')
div.innerHTML=str;
var obj= div.getElementsByTagName('div');
for (var i=0; i<obj.length; i++)  {
  if(obj[i].className=="c2") {
   obj[i].parentNode.removeChild(obj[i]) ;break
    }
}
str=div.innerHTML;
alert(str);

Wyfinger 22.10.2010 03:04

Цитата:

Сообщение от рони (Сообщение 75223)
Вариант без регулярок
var str = '<div class="c1">text1<div class="c2">text2<div class="c3">text3</div></div></div>';
var div =  document.createElement('div')
div.innerHTML=str;
var obj= div.getElementsByTagName('div');
for (var i=0; i<obj.length; i++)  {
  if(obj[i].className=="c2") {
   obj[i].parentNode.removeChild(obj[i]) ;break
    }
}
str=div.innerHTML;
alert(str);

Да нет, мне нужен разбор текста, а не элементов DOM.

Jurasmi 22.10.2010 11:48

Информационный шум:
Цитата:

Если у вас есть проблема и вы думаете, что можете решить её с помощью регулярки, то, на самом деле, у вас две проблемы.


Часовой пояс GMT +3, время: 07:16.