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

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-12 12:36:10

есть текст html, нужно перевести его в текст...

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

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

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

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

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

$html_string =~ s/\<table(.*?)\>(.*?)\<\/table\>/Dump_table($2)/igs; 
в google не нашел, вообще...
как вставить функцию или как такое реализовать?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

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

Непрочитанное сообщение hizel » 2010-10-12 12:57:26

используй первоисточники http://perldoc.perl.org/perlretut.html
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-12 16:06:42

hizel писал(а):используй первоисточники http://perldoc.perl.org/perlretut.html
я там это не могу найти, посмотрел полностью то что по ссылке...
...можешь пальцем тыкнуть пожалуйста на то что ты имеешь ввиду там?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

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

Непрочитанное сообщение hizel » 2010-10-12 16:59:47

В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

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

Непрочитанное сообщение thefree » 2010-10-12 20:23:58

5.12 не у всех, а вообще человеку дорога на cpan
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

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

Непрочитанное сообщение hizel » 2010-10-12 20:52:50

в 5.10 тоже есть
я правда не понимаю зачем
1. исполнять в этом случае что-то в регулярке
2. парсить html regexp_ами
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-13 1:28:09

hizel писал(а):я правда не понимаю зачем
объясню зачем:

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

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

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

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

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

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

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

как ты по другмоу сделаешь, кроме того что я написал в первом посте?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-15 9:53:01

thefree писал(а):
5.12 не у всех, а вообще человеку дорога на cpan
т.е. нужно найти модуль который позволяет использовать возможности 5.12?

но как он называется? я не могу найти...
http://search.cpan.org/search?m=all&q=perl5%2E12&s=11
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-15 9:58:43

вродебы нашел, только я не знаю он это или нет...

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

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
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

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

Непрочитанное сообщение thefree » 2010-10-15 10:21:18

Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-15 10:29:51

дело в том что тут есть таблицы большие в html тегах

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

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

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

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

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

       [ '.=', '=.', '-', '-' ],    # .=-----------=.
        [ '|',  '|',  '|' ],         # | info | info |
        [ '|-', '-|', '=', '=' ],    # |-===========-|
        [ '|',  '|',  '|' ],         # | info | info |
        [ "'=", "='", '-', '-' ],    # '=-----------='
        [ '|=', '=|', '-', '*' ]     # rowseperator
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-10-22 17:58:47

да, решил, так:

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

 

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

   $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
    );
}



 
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение