
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Song, помогу, как смогу.
Вот тебе парсер: преобразует текст с тегами в дерево. Чётность не считается, но дерево проще проанализировать, чем текст. ![]() ![]() $/=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 |
Сообщ.
#17
,
|
|
|
Цитата Mixxx @ Я ж говорю что теги code должны быть парными. Т.е. в данном случае полная картина должна выглядеть так [ code ][gg]as[/gg][gg]ansa[/gg][ /code ] Поэтому функция должна возвращать false Парность должна учитываться только в [gg]. В code - нет. А то что я написал это я не до конца задачу представил себе тогда. Tishaishii, спасибо. |
Сообщ.
#18
,
|
|
|
В коде выше:
![]() ![]() ......... next unless $tree->{tag} eq $tag; ............. Вот здесь можно не делать next, а выдавать ошибку о том, что "парность" не соблюдена. ![]() ![]() die 'Парность не соблюдена' unless $tree->{tag} eq $tag; ![]() ![]() return -1 unless $tree->{tag} eq $tag; |