2012-12-17 17 views
0

我通常會將散列轉換爲下拉。但是這一次,我想做相反的事情。有誰知道如何使用正則表達式來做到這一點?或任何其他方式。請注意,下拉列表包含optgroup和options。我只想要這個選項,這樣id就是散列的關鍵,而下拉的值就是散列的值。Perl:如何將下拉轉換爲哈希?

例如,如果我們有一個下拉如下:

<select> 
<optgroup label=fruits> 
<option id=1>Apple</option> 
<option id=2>Orange</option> 
<option id=3>Pineapple</option> 
<optgroup label=stuff> 
<option id=4>Chair</option> 
<option id=5>Board</option> 
</select> 

我想這是

1=> "apple", 2=>"Orange",3=>"Pineapple",4=>"Chair", 5=>"Board" 
+3

你們是不是要問如何使用正則表達式解析HTML? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

如果您正在嘗試將XML文檔加載到Perl哈希中,請使用XML :: Simple模塊al cpan –

+1

以下是如何使用Perl解析HTML的示例:http://htmlparsing.com/perl.html –

回答

1

我建議你留意本傑克遜的有關與正則表達式解析HTML警告。

但是,有時您需要一個快速和骯髒的解決方案。你可以做這樣的事情:

use warnings; 
use strict; 

my %options; 
while (<DATA>) 
{ 
    if (/^<option\s+id=(\d+)>([\w\s]+)/) 
    { 
     $options{$1} = $2; 
    } 
} 

print "$_: $options{$_}\n" for (keys %options); 

__DATA__ 
<select> 
<optgroup label=fruits> 
<option id=1>Apple</option> 
<option id=2>Orange</option> 
<option id=3>Pineapple</option> 
<optgroup label=stuff> 
<option id=4>Chair</option> 
<option id=5>Board</option> 
</select> 

這使得各種假設,如:選項標籤從來沒有在它的其他屬性,它始終是在一行的開頭,選擇ID是唯一的整個文件等

如果你的輸入是相當可預測的,所以你可以做出這樣的假設,這應該工作得很好。但是,如果您需要「通用」解決方案,請勿使用正則表達式。

3

你不解釋你的select元素的來源,但我認爲它是一個完整的HTML文檔的一部分?

這最好用 HTML::TreeBuilder完成,它將構建HTML頁面的樹形結構並允許您瀏覽它。

該程序所要做的就是查找頁面中第一個select語句的所有option後代,並使用id屬性和文本值作爲每對的鍵和值構建散列。

我已經使用Data::Dump來演示最終散列的內容。

use strict; 
use warnings; 

use HTML::TreeBuilder; 

my $tree = HTML::TreeBuilder->new_from_content(<<'END'); 

<select> 
<optgroup label=fruits> 
<option id=1>Apple</option> 
<option id=2>Orange</option> 
<option id=3>Pineapple</option> 
<optgroup label=stuff> 
<option id=4>Chair</option> 
<option id=5>Board</option> 
</select> 

END 

my $select = $tree->look_down(_tag => 'select'); 

my %data = map { $_->id => $_->as_trimmed_text } $select->look_down(_tag => 'option'); 

use Data::Dump; 
dd \%data; 

輸出

{ 1 => "Apple", 2 => "Orange", 3 => "Pineapple", 4 => "Chair", 5 => "Board" }