На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ALXR
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
    > Нужен preg_match , php
      Song, помогу, как смогу.

      Вот тебе парсер: преобразует текст с тегами в дерево. Чётность не считается, но дерево проще проанализировать, чем текст.
      ExpandedWrap disabled
        $/=undef;
         
        sub build_tree {
            my($tree, $str)=(shift, shift);
            my($lpos, $item, $tag, $pos)=0;
            while($str=~m{\[(/?)(.*?)\]}gc) {
                $tag=uc $2;
                if(length $1) {
                    next unless $tree->{tag} eq $tag;
         
                    ($tree->{closed}, $pos)=(1, pos $str);
                    push @{$tree->{cont}},
                            substr $str, $lpos, $pos-$lpos-length $&;
         
                    return $pos
         
                }
                ($item, $pos)=({tag=>$tag, cont=>[]}, pos $str);
                push @{$tree->{cont}}, substr($`, $lpos, $pos - length $&), $item;
                $lpos=$pos+&build_tree($item, substr $str, $pos);
                pos($str)=$lpos;
            }
            push @{$tree->{cont}}, substr $str, $lpos;
            +$lpos
        }
         
        sub DOM {
            my($str, $tree)=(shift || return, shift || {cont=>[]});
            &build_tree($tree, $str);
            +$tree
        }
         
        use Data::Dumper;
        print Dumper DOM <DATA>;
         
         
        __DATA__
         
         
         
        fgth gfhgf
        [/CDE]
        [CDE]
            [GG]klldksfklds34[/GG]
            ds fds fl;l;dsf
            [GG]
                786893ii
                [CODE]klldksfklds6[/CDE]
                klldksfklds7
            [/GG]
        [/CDE]
        [CDE]
            sdf dsgfdhfhfgjh
            [GG]klldksfklds34[/GG]
            dd fds fl;l;dsf
            [GG]klldksfklds6[/GG]fhfgjh
        [/CDE]
        sdl;f kdsl;f
        Цитата Mixxx @
        Я ж говорю что теги code должны быть парными. Т.е. в данном случае
        полная картина должна выглядеть так
        [ code ][gg]as[/gg][gg]ansa[/gg][ /code ]
        Поэтому функция должна возвращать false

        Парность должна учитываться только в [gg].
        В code - нет.
        А то что я написал
        Цитата Song @
        Хорошо бы, чтобы ещё проверять и [ CODE ] и [GG] - парные.

        это я не до конца задачу представил себе тогда.

        Tishaishii, спасибо.
          В коде выше:
          ExpandedWrap disabled
            .........
            next unless $tree->{tag} eq $tag;
            .............

          Вот здесь можно не делать next, а выдавать ошибку о том, что "парность" не соблюдена.
          ExpandedWrap disabled
            die 'Парность не соблюдена' unless $tree->{tag} eq $tag;
          или
          ExpandedWrap disabled
            return -1 unless $tree->{tag} eq $tag;
          с последующей проверкой на -1.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0277 ]   [ 15 queries used ]   [ Generated: 19.07.25, 16:04 GMT ]