• ベストアンサー

タグの中の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>タグの中の"と"の間に > が含まれる場合に正しく動作しません。 何いい方法はないでしょうか.

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

正規表現だと面倒そうだし、応用も利くので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"; } }

参考URL:
http://homepage3.nifty.com/hippo2000/perltips/html/Parser.htm
ytse
質問者

お礼

パーサを使うといいのですね。 先ほど、cgi-lib.plの中身を眺めながら 正規表現で解決しようと四苦八苦していました.. 実を言うと使っているのはPHPなので、XML Parser 関数あたりを 利用すればいいのでしょうか。 いろいろ調べてみます. ありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

正規表現だと、こういう解析が困難です。 自分で解析するのもいいけど、モジュールを使うと楽ちん 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"; } }

ytse
質問者

お礼

#2さん、度々お世話になってます。 何かと正規表現を使う癖がついていたので、大変参考になりました。 またよろしくお願いします。 ありがとうございました。

関連するQ&A

専門家に質問してみよう