2011-08-02 23 views
1

我試圖通過「table」標記及其內容拆分html代碼塊。Perl - 通過「table」標記及其內容拆分html代碼

所以,我想

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

在這之後,我想@values陣列看起來像這樣: array('aaa', 'bbb', 'ccc')。 但是它返回這個數組: 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

你的正則表達式是貪婪的,將其更改爲/<table.*?\/table>/,它會做你想要什麼。但是如果你打算做任何認真的工作,你應該真正關注一個合適的HTML解析器。搜索CPAN應找到一個適合您的需求。

+1

如果它還沒有足夠的鏈接,[這是爲什麼](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 –

3

您的正則表達式.*是貪婪的,因此咀嚼它的方式到字符串的最後部分。將其更改爲.*?,它應該會更好。

2

使用?指定非貪婪通配符字符啜,即

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")