2011-08-02 11 views
1

"table"タグとその内容でhtmlコードの断片を分割しようとしています。 array('aaa', 'bbb', 'ccc')Perl - "table"タグとその内容で分割されたhtmlコード

だから、私は@values配列は次のようになりたい、この後

my $html = 'aaa<table>test</table>bbb<table>test2</table>ccc'; 
my @values = split(/<table*.*\/table>/, $html); 

を試してみました。 しかし、この配列を返します: array('aaa', 'ccc')。 分割機能にどのように指定して各テーブルを個別に解析する必要があるのか​​誰にでも教えていただけますか?

ありがとうございました!

+4

HTMLを解析するときは、HTMLパーサーを使用します。 PerlにはIIRCがあります。 – You

+3

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

答えて

4

、非欲張りワイルドカード文字をズルズルを指定する?を使用してください。しかし、深刻な作業をする場合は、適切なHTMLパーサを実際に調べる必要があります。 CPANの検索では、あなたのニーズに合ったものを見つけるはずです。

+1

まだリンクされていない場合は、[こちらの理由](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 –

3

正規表現.*は貪欲であり、したがって文字列の最後の部分に向かって噛んでいます。それを.*?に変更すると、よりうまくいくはずです。

2

はあなたの正規表現は/<table.*?\/table>/に変更し、貪欲であり、それはあなたがやりたいだろうすなわち

my @values = split(/<table*.*?\/table>/, $html); 
2

おそらく、HTMLパーサーを使用するのは、あなたの例では少し残念ですが、後で例が大きくなるときにはやる気があります。ソリューションを使用するHTML::TreeBuilder

use HTML::TreeBuilder; 
use Data::Dump qw(dd); 

my $html = 'aaa<table>test</table>bbb<table>test2</table>ccc'; 
my $tree = HTML::TreeBuilder->new_from_content($html); 

# remove all <table>....</table> 
$_->delete for $tree->find('table'); 

dd($tree->guts);  # ("aaa", "bbb", "ccc") 
関連する問題