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の子孫を見つけ、属性とテキスト値を各ペアのキーと値として使用してハッシュを作成することだけです。selectid

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

HTML を正規表現で解析することに関する Ben Jackson の警告に注意することをお勧めします。

ただし、迅速で汚い解決策が必要な場合もあります。次のようなことができます。

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 に答える