Страница 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
Re: [Perl] вставить функцию в регулярное выражение
Добавлено: 2010-10-12 16:06:42
ProFTP
я там это не могу найти, посмотрел полностью то что по ссылке...
...можешь пальцем тыкнуть пожалуйста на то что ты имеешь ввиду там?
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
вродебы нашел, только я не знаю он это или нет...
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
);
}