0

我通常将哈希转换为下拉。然而这一次,我想做相反的事情。有谁知道如何使用正则表达式来做到这一点?或任何其他方式。请注意,下拉菜单包含 optgroup 和选项。我只想要这个选项,这样 id 就是哈希的键,下拉的值就是哈希的值。

例如,如果我们有如下下拉:

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

2 回答 2

3

您没有解释select元素的来源,但我认为它是完整 HTML 文档的一部分?

最好使用 来完成此操作 HTML::TreeBuilder,它将构建 HTML 页面的树结构并允许您在其中导航。

这个程序所做的就是找到页面option中第一条语句的所有后代,并使用属性和文本值作为每对的键和值来select构建散列。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" }
于 2012-12-17T23:16:15.497 回答
1

我建议您注意 Ben Jackson 关于使用正则表达式解析 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 对整个文件是唯一的,等等。

如果您的输入是完全可预测的,以便您可以做出这样的假设,那么这应该可以正常工作。但是,如果您需要“通用”解决方案,请不要使用正则表达式。

于 2012-12-17T14:58:42.833 回答