Страница 1 из 1

[Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-12 12:36:10
ProFTP
есть текст html, нужно перевести его в текст...

и тут стала проблема что надо таблицы которые в разметке перевести в текстовый вид красиво как таблица...

вот нашел отличное решение:
http://www.perlmonks.org/?node_id=338485

только еще у меня в тексте несколько таблиц...

как написать примерно такое регулярное вырадение чтобы вставить туда функцию Dump_table, например:

Код: Выделить всё

$html_string =~ s/\<table(.*?)\>(.*?)\<\/table\>/Dump_table($2)/igs; 
в google не нашел, вообще...
как вставить функцию или как такое реализовать?

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-12 12:57:26
hizel
используй первоисточники http://perldoc.perl.org/perlretut.html

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-12 16:06:42
ProFTP
hizel писал(а):используй первоисточники http://perldoc.perl.org/perlretut.html
я там это не могу найти, посмотрел полностью то что по ссылке...
...можешь пальцем тыкнуть пожалуйста на то что ты имеешь ввиду там?

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-12 16:59:47
hizel

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-12 20:23:58
thefree
5.12 не у всех, а вообще человеку дорога на cpan

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-12 20:52:50
hizel
в 5.10 тоже есть
я правда не понимаю зачем
1. исполнять в этом случае что-то в регулярке
2. парсить html regexp_ами

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-13 1:28:09
ProFTP
hizel писал(а):я правда не понимаю зачем
объясню зачем:

у меня есть html файл большой...

а нем есть таблица с колонками и с строками

Код: Выделить всё

<table><tr><td></td></tr>........................etc</table>
нужно перевести в текствый вид... чтобы смотрелось красиво...

я нашел решение:
http://www.perlmonks.org/?node_id=338485

Код: Выделить всё

        [ '.=', '=.', '-', '-' ],    # .=-----------=.
        [ '|',  '|',  '|' ],         # | info | info |
        [ '|-', '-|', '=', '=' ],    # |-===========-|
        [ '|',  '|',  '|' ],         # | info | info |
        [ "'=", "='", '-', '-' ],    # '=-----------='
        [ '|=', '=|', '-', '*' ]     # rowseperator
т.е. мне таблицы нужно "вынять" с html файла таблицы и обработать...

как ты по другмоу сделаешь, кроме того что я написал в первом посте?

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-15 9:53:01
ProFTP
thefree писал(а):
5.12 не у всех, а вообще человеку дорога на cpan
т.е. нужно найти модуль который позволяет использовать возможности 5.12?

но как он называется? я не могу найти...
http://search.cpan.org/search?m=all&q=perl5%2E12&s=11

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-15 9:58:43
ProFTP
вродебы нашел, только я не знаю он это или нет...

Код: Выделить всё

use Modern::Perl;
UPD:
For now, this only enables the strict and warnings pragmas, as well as all of the features available in Perl 5.10. It also enables C3 method resolution order; see perldoc mro for an explanation. In the future, it will include additional CPAN modules which have proven useful and stable.
http://search.cpan.org/~chromatic/Moder ... rn/Perl.pm
нет, таки Perl 5.10

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-15 10:21:18
thefree

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-15 10:29:51
ProFTP
дело в том что тут есть таблицы большие в html тегах

а эти конвекторы не переводят таблицы...

т.е. таблица просто будет как набор букф... на таблицу не будет похоже...

вот я нашел решение http://www.perlmonks.org/?node_id=338485

теперь я хочу найти таблицы в тексте и их перевести такой красивый ТЕКСТОВЫЙ вид

Код: Выделить всё

       [ '.=', '=.', '-', '-' ],    # .=-----------=.
        [ '|',  '|',  '|' ],         # | info | info |
        [ '|-', '-|', '=', '=' ],    # |-===========-|
        [ '|',  '|',  '|' ],         # | info | info |
        [ "'=", "='", '-', '-' ],    # '=-----------='
        [ '|=', '=|', '-', '*' ]     # rowseperator

Re: [Perl] вставить функцию в регулярное выражение

Добавлено: 2010-10-22 17:58:47
ProFTP
да, решил, так:

Код: Выделить всё

 

...............................................

   $text =~ s/<table(.*?)>(.*?)</table>/&dumptt($2)/egs;


sub dumptt {

  my($html) = (@_);

$html = " <table> ". $html." </table>";

 my $t = HTML::TreeBuilder->new();
 $t->parse($html);
 $t->eof;

foreach  my $em ($t->find_by_tag_name('table')) {
  my $em2 = $em;
   
 my @tar = $em2->find_by_tag_name('tr');
 
  if ($#tar > 3) { 


    my $ttt = Encode::encode( 'cp1252',DumpTable( $em )), $/, $/;


$ttt =~ s/ /-/isg;

$ttt = "1111111111111111".$ttt."2222222222222222";

    
return $ttt; 

  }
  
     else {
        return "";
    }
#

    }
}

sub DumpTable {
    my($ht, $depth) = (@_,0);

    die "$ht is not a table" unless $ht->tag eq 'table';

    my $tt = Text::ASCIITable::->new;
    my @co;
    my @da;
    my $da = [];

    for my $ro ( @{ $ht->content() } ) {

        if( $ro->tag eq 'tr' ) {

            push @da, $da if @$da;
            $da = [];

            for my $ce ( @{ $ro->content() } ) {

                if( $ce->tag eq 'td' ) {

                    if( $ce->look_down( '_tag', 'table' ) ) {
                        my $string = '';

                        for my $i ( @{ $ce->content() } ) {
                            if( not ref $i ) {
                                $string .= $i;
                            }
                            elsif( $i->tag eq 'table' ) {
                                $string .= "\n";
                                $string .= DumpTable($i,$depth+1);
                                $string .= "\n";
                            }
                            else {
                                $string .= $i->as_text;
                            }
                        }

                        push @$da, $string;
                    }
                    else {
                        push @$da, $ce->as_text;
                    }
                }
                elsif( $ce->tag eq 'th' ) {
                    push @co, $ce->as_text;
                }
            }
        }
    }

    push @da, $da if @$da;

    unless(@co) {
        use List::Util qw(max);
        my $max = 1 + max( 0, map { $#$_ } @da );
        ( @co ) = (' ') x $max ;
        $tt->setOptions( hide_HeadRow  => 1 );
        $tt->setOptions( hide_HeadLine => 1 );
    }
#    warn " co ", map {"{$_}"} @co;
    $tt->setCols( @co );
    if( $depth == 0 ){
        my $maxcolwidth = 120;
        $maxcolwidth -= 1 for split //, '.==.'; # bad guesstimation
        $maxcolwidth -= 2 for @co; # '| ' and '| '
        $tt->setColWidth( $_, $maxcolwidth/(0+@co), 1) for @co;
    }

    $tt->addRow($_) for @da;

    $tt->setOptions( 'drawRowLine', 1) if $ht->attr('border');
#    return $tt->draw();
    return $tt->draw(
        [ '.=', '=.', '-', '-' ],    # .=-----------=.
        [ '|',  '|',  '|' ],         # | info | info |
        [ '|-', '-|', '=', '=' ],    # |-===========-|
        [ '|',  '|',  '|' ],         # | info | info |
        [ "'=", "='", '-', '-' ],    # '=-----------='
        [ '|=', '=|', '-', '*' ]     # rowseperator
    );
}