- ベストアンサー
タグの中のname, value値の取得
ある文字列中に次のほぼ同値なinputタグ、 1:<input type="text" name="A" value="B"> 2:<input type='text' name='A' value='B'> 3:<input type=text name=A value=B> がある場合、この中からtext, A, B を抽出しようと思っています. (さらに、1,2のA, B に半角スペースが含まれる場合も考慮) 自分なりの方法の概略は、 $_ = $str; ~ /(<input[^>]*?>)/; $tag = $1; として、<input・・・>を得て、 $tag =~ /name=[\"']{0,1}([^\"']*?)[\"']{0,1}[\s\t>]/i $name = $1; $tag =~ /value=[\"']{0,1}([^\"']*?)[\"']{0,1}[\s\t>]/i $value = $1; としていたのですが、nameとvalue値が\sを含む場合や、<input>タグの中の"と"の間に > が含まれる場合に正しく動作しません。 何いい方法はないでしょうか.
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
正規表現だと面倒そうだし、応用も利くのでHTMLを解析するモジュールを使ってみては? 以下、ちょっと長いけど例。 my $str = <<HTMLDATA; <input type="text" name="A" value="B"> <input type='text' name='A' value='B'> <input type=text name=A value=B> HTMLDATA use HTML::Parser(); my $parser = HTML::Parser->new( api_version => 3, start_h => [\&startTag, "tagname,attr"], ); $parser->parse( $str ); $parser->eof; exit; sub startTag { my($tagname,$attr) = @_; if($tagname eq 'input') { print 'name="',$attr->{name},'" value="',$attr->{value},"\"\n"; } }
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
正規表現だと、こういう解析が困難です。 自分で解析するのもいいけど、モジュールを使うと楽ちん HTML::TokeParserを使った例 use HTML::TokeParser; $str=<<DATA; 1:<input type="text" name="A" value="B"> 2:<input type='text' name='<A>' value='<B/>'> 3:<input type=text name=A value=B> DATA $parser = HTML::TokeParser->new(\$str); while($token = $parser->get_token()){ #$token : [ type tag attribute_hash ] if($token->[0] eq 'S' && $token->[1] eq 'input'){ $name = $token->[2]{'name'}; $value = $token->[2]{'value'}; print "name=$name\n"; print "value=$value\n"; } }
お礼
#2さん、度々お世話になってます。 何かと正規表現を使う癖がついていたので、大変参考になりました。 またよろしくお願いします。 ありがとうございました。
お礼
パーサを使うといいのですね。 先ほど、cgi-lib.plの中身を眺めながら 正規表現で解決しようと四苦八苦していました.. 実を言うと使っているのはPHPなので、XML Parser 関数あたりを 利用すればいいのでしょうか。 いろいろ調べてみます. ありがとうございました。