2012-12-17 21 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" }