プロが教えるわが家の防犯対策術!

$hoge = ’
<select name="a">
<option value="A" selected>■</option>
<option value="B">★</option>
<option value="C">▲</option>
</select>

<select name="b">
<option value="A">■</option>
<option value="B">★</option>
<option value="C" selected>▲</option>
</select>
’;



となっている場合、
『selected』が付いているoptionにマッチさせ、
そのvalue値【A】や【C】を$hoge1や$hoge2へ代入したいのですが、正規表現はどのようになるのでしょうか?

$hoge =~ /value="?([^"]+)"? selected/g
$hoge1 = $1;
$hoge2 = $2;

↑これでは、ダメでした。
御教授 お願い致しますm( __ __ )m

A 回答 (4件)

左辺をリストにするとパターン内の()のパターンに一致した部分のリストが返ります。



$_ = $hoge;
my @hoge = /value="(.+)" selected/g;

for(@hoge){
print $_,"\n";
}
    • good
    • 0
この回答へのお礼

steel_grayさん
おかげさまで、解決しました。
また一つ勉強になりました。

大変ありがとうございました。

お礼日時:2005/04/21 23:40

$hogeの内容がサンプルのようなフォーマットでしたら



($hoge1,$hoge2) = $hoge =~ /value="([^"]+)" selected/g;

でよいとおもいます。
もうすこし一般的に対応させるならこんな感じですかね

$cunt = 0;
while ($hoge =~ /<option\s+value\s*=\s*(?:"([^"]*?)"|(\S+))\s*selected\s*>/ig) {
$cunt++;
${"hoge$cunt"} = defined $1 ? $1 : $2;
}
    • good
    • 0
この回答へのお礼

moon_piyoさん
ありがとうございました。

せっかく回答をいただきましたが、うまく代入されませんでした。。。

お礼日時:2005/04/21 23:44

#1 です。



> foreach $hoge (@home) {

は、

foreach $hoge (@html) {

の間違えです。申し訳ない。
    • good
    • 0
この回答へのお礼

Dpop 専門家さん
ありがとうございました。

こんな方法があったんですね。
せっかく回答をいただきましたが、うまく代入されませんでした。。。

お礼日時:2005/04/21 23:48

全ての行をまとめて処理するのではなく、一行単位に処理すれば良いと思いますよ。



$hoge =~ m/^<option +value=\"(.+)\" +selected>/;
$hoge1 = $1;

で、$hoge1 にvalueの値が入ると思います。
後は、指定されているHTMLの文をループで引き渡せば良いと思います。

$html =<< "EOH";
<select name="a">
<option value="A" selected>■</option>
<option value="B">★</option>
<option value="C">▲</option>
</select>

<select name="b">
<option value="A">■</option>
<option value="B">★</option>
<option value="C" selected>▲</option>
</select>
EOH

@html = split(m/\n/, $html);
@hoge = ();
foreach $hoge (@home) {
if ($hoge =~ m/^<option +value=\"(.+)\" +selected>/) {
push(@hoge, $1);
}
}

foreach (@hoge) {
print $_. "\n";
}

こんな感じかな。。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!