我通常将哈希转换为下拉。但是这一次,我想做相反的事情。有谁知道如何使用正则表达式?或任何其他方式。请注意,下拉列表包含optgroup和options。我只想要这个选项,这样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"
答案 0 :(得分: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" }
答案 1 :(得分: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对整个文件是唯一的,等等。
如果您的输入是可预测的,那么您可以做出类似的假设,这应该可以正常工作。但是,如果您需要“通用”解决方案,请不要使用正则表达式。