Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > регулярное выражение


Автор: Frozen_Coyote 26.7.2011, 11:26
Добрый день,

помогите плиз составить регулярку, очищающую тег от мусора (стили, классы  и прочее) НО:

если в теге присуствует colspan=значение или rowspan=значение - эти параметры оставлять

Код

str = "<td style=\"height: 20%\" rowspan=\"3\">1</td><td style=\"width: 50%\" colspan=\"2\">3</td>";
myRe=/<(.+?)\s(.+?)?(colspan|rowspan=\"(.+?)\")?(.+?)>/gi;
str = str.replace(myRe, '<$1 $3>');
alert(str);


эта вот канитель у меня само собой не работает!

буду признателен за помощь!

Автор: Evghenusi 27.7.2011, 00:03
может так?
Код

str = str.replace(/<(\w+).*?((?:rowspan|colspan)="\d+")?>/gi, '<$1 $2>');


или так, для экранированных кавычек
Код

/<(\w+).*?((?:rowspan|colspan)=\\"\d+\\")?>/gi

Автор: Frozen_Coyote 27.7.2011, 10:23
Хм... почему то не отрабатывает ((( тестовая строка не изменилась на выходе

Автор: Evghenusi 27.7.2011, 11:13
всё отрабатывает. я просто тестировал на онлайн сервисе, а им не всегда можно верить)
Код

    str = "<td style=\"height: 20%\" rowspan=\"3\">1</td><td style=\"width: 50%\" colspan=\"2\">3</td>";
    myRe=/<(\w+).*?( (?:rowspan|colspan)=\"\d+\")?>/gi;
    str = str.replace(myRe, '<$1$2>');
    alert(str);

убрал лишние бэкслэши, и вуаля

Автор: Frozen_Coyote 27.7.2011, 11:38
Я немного неверно сформулировал. Смысл в том, что отрабатывает верно, если colspan и rowspan присуствуют в теге.. а если этих параметров нет - то и тег не очищается - все стили остаются (( а задача у меня такая чтобы стили вычищались по любому, независимо от ого, есть ли colspan или rowspan или нет

Автор: Evghenusi 27.7.2011, 11:46
ниХе не понял, 
Цитата

а задача у меня такая чтобы стили вычищались по любому, независимо от ого, есть ли colspan или rowspan или нет 
так и работает.

покажите текст который у вас есть, и что вы хотите получить.

Автор: Frozen_Coyote 27.7.2011, 12:14
Ваш код отрабатывает хорошо только если базовая строка именно в таком вот виде.

а попробуйте допустим rowspan="3" перенести ПЕРЕД style="" - уже не отрабатывает

я немного конец модифицировал выражения, вместо ? написал .+? - тогда перестановка неважна, НО тогда и теги БЕЗ rowspan и colspan перестает чистить. Вот я про что smile

Автор: Evghenusi 27.7.2011, 14:03
Цитата
вместо ? написал .+?
метасимвол ? сам по себе тоже несёт смысл. если уж модифицировать то ?.+?

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

Автор: Frozen_Coyote 27.7.2011, 14:12
В любом случае огромное спасибо за участие

Автор: Frozen_Coyote 1.8.2011, 15:17
Ну что, господа - никто не сможет помочь? я уже мозг се свернул (((

Автор: Frozen_Coyote 2.8.2011, 14:30
Кому интересно, КАК smile

что то типа такого!

Код

    function work_fun(match)
    {
        str = match;

        //НАХОДИМ ТЭГ
        reg = /<(\w+)\s(.*?)>/gi;
        tag = str.replace(reg, "$1")

        //НАХОИМ ROWSPAN
        reg = /(rowspan="(.*?)")/gi;
        if(str.match(reg) != null)
        var rs = " " + str.match(reg) + " ";
        else
        var rs = "";

        //НАХОИМ COLSPAN
        reg = /(colspan="(.*?)")/gi;
        if(str.match(reg) != null)
        var cs = " " + str.match(reg) + " ";
        else
        var cs = "";

        return "<" + tag + rs + cs + ">";
    }


    str = "<b >Начало текста</b><table ><tr><td  style=\"height: 20%\" rowspan=\"3\" >1</td><td colspan=\"2\" style=\"width: 50%\"  rowspan=\"5\">3</td><td style=\"width: 50%\">4</td></tr></table><i>Конец текста</i>";

    reg = /<(\w+)\s(.*?)>/gi;
    clear_res = str.replace(reg, work_fun);

    alert(clear_res)

Автор: Evghenusi 3.9.2011, 12:51
эээх, не там спрашивали  smile 
http://forum.vingrad.ru/forum/topic-337373.html

от alezzz
Код
myRe=/(?<=<td)((?:\s+(?:colspan|rowspan)="[^"]+")*)\s+\w+="[^"]+"/gi;
str = str.replace(myRe, '$1');

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)