• ベストアンサー

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

  • ytse
  • お礼率71% (88/123)
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • value文のないInputタグ

    Inputタグの内容を送信したいのですが、 例えば、フォームF1のテキストエリアT1に、 document.F1.T1.value = "テスト"; として、JavaScript側から値(value)を指定します。 この場合、 <form method="post" name="F1"> <input type="text" name="T1"> </form> とするだけで、ブラウザに、「テスト」と表示させられますよね。 しかし、Inputタグの中に「value」の値が無いため、 他のURLに、テキストエリア「T1」の内容を送信することができません。 このようにJavaScript側から値(value)を指定したInputタグの値を送信する方法について教えてください。

  • POSTデータのNAME属性をVALUEによって取得する方法

    HTML→PHPのPOSTデータのやりとりについて、 【HTML】 <form name="form1" method="post" action="xxx.php"> <input name="01" type="text" value="1"> <input name="02" type="text" value="0"> <input name="03" type="text" value="0"> <input name="04" type="text" value="1"> <input type="submit" name="Submit" value="送信"> </form> 【xxx.php】 フォームから送信されたデータを使って、「value」が"1"の「name」を拾うのにはどのように書けばいいでしょう? ↓このように取得したいです。 $data[0]="01"; $data[1]="04"; よろしくお願いします。

    • ベストアンサー
    • PHP
  • inputタグのnameとvalue属性について教えてください。

    inputタグのnameとvalue属性について教えてください。 <label><input type="radio" name="性別" value="男" />男</label> <label><input type="radio" name="性別" value="女" />女</label> という風にformの内容は「name:valueで1セット」として送信されると思っていました しかしxhtml1.1ではname属性が廃止されたと思います。 xhtmlではvalueだけでデータを送信するのでしょうか? それとも、form内のname属性は例外でしょうか?

  • tableタグとformタグの組み合わせ

    tableタグとformタグの組み合わせでどのように記述すれば、構文上正しいのでしょうか? 私は下のパターンで書いておりますが、間違いでしたら早めに改めたいので お聞きしました。 <table> <form> <input type="hidden" name="a" value="1"> <tr> <td> <input type="text" name="b" value=""> </td> </tr> <tr> <td> <input type="submit" value="OK" value=""> </td> </tr> </fomr> </table>

    • ベストアンサー
    • HTML
  • 複数のvalue値を返すには

    Aを選択した時10、Bを選択した時100、Cなら1000と <input type="text" name="TEXT" value="">に表示されるように以下のようなjavascriptを記述しましたが、 Aの時10と20を、Bの時100と200、Cの時1000と2000が もうひとつの<input type="text" name="TEXT2" value="">に表示できるようにするにはどうしたらよいのでしょうか。 記述方法を教えていただければ一番いいのですが、サンプルがあるページでもいいので、教えてください。 <script type="text/javascript"> <!-- function kai(){ document.FORM.TEXT.value = document.FORM.num.value; } //--> </script> </head> <body> <form name="FORM"> <input type="text" name="TEXT" value=""> <select name="num" onChange="kai()"> <option value="10">A</option> <option value="100">B</option> <option value="1000">C</option> </select> </form>

  • フォームで同じ複数のnameで違うvalueの送信

    始めまして、現在一個のフォーム内で複数の同じnameで、違うvalueを送信しようと苦戦しております、、普通にタグを書くだけでは 一個のnameで違うvalueの送信は、最後のvalueしか送信できないです、 phpは使用できません。javaは、、殆ど素人なので、あまり分かりません、、formを一個一個区切るのも、レイアウト上できません、、 どうすればいいのでしょうか?・・・以下タグです。 昨日から、ここから先に進めません。。 先輩方助けてください、本当によろしくお願いします。 <form action="http://hoge.net/hoge/hogecheck.php" method="post"> <input type="hidden" name="site" value="hoge"> <input name="id" type="text" id="idform" maxlength="10" /> <input type="hidden" name="kin" value="3000"> <input type="image" src="buybtn.gif" /> <input type="hidden" name="kin" value="5000"> <input type="image" src="buybtn.gif" /> <input type="hidden" name="kin" value="10000"> <input type="image" src="buybtn.gif" /> <input type="hidden" name="kin" value="20000"> <input type="image" src="buybtn.gif" /> </form>

    • ベストアンサー
    • Java
  • HTMLのinputタグ数が変わる場合のjavascript処理

    パターンA ~HTML~ <input type='text' name='a[]'> <input type='text' name='a[]'> ~JavaScript~ var n = document.form1.elements["a"][0].value ; var n = document.form1.elements["a"][1].value ; パターンB ~HTML~ <input type='text' name='a[]'> ~JavaScript~ var n = document.form1.elements["a"][0].value ; ---(1) パターンAではエラーが出ないのですが、パターンBでは(1)のところでエラーになってしまいます。 【elements["a"][0]】の部分を【elements["a"]】とすればエラーは出ません。 どうやら、inputタグが1つしかない場合は、Javascriptでは配列として認識しないようです。 できれば、inputタグが1つの場合でも複数の場合でも、同じJavascriptコードを使いたいのですが、何か良い方法はありますか?

  • 同じ作業を複数させる場合

    ちょっとタイトルのつけ方が下手でしたが、やりたいことはこんな感じです。 <FORM name="f1"> <INPUT type="text" name="t1" onblur="document.f1.t1a.value=this.value,document.f1.t1b.value=this.value.length;"> <INPUT type="text" name="t1a"> <INPUT type="text" name="t1b"> <FORM> と、このようなフォームをつくり、t1に半角文字を入力した際にt1a、t1bに入力された文字と その文字数を書き出すようにしたいのですが、これが複数あった場合にうまく省略する方法はないものか? と思い質問させていただきました。仮に、 <FORM name="f1"> <INPUT type="text" name="t1" onblur="document.f1.t1a.value=this.value,document.f1.t1b.value=this.value.length;"> <INPUT type="text" name="t1a"> <INPUT type="text" name="t1b"> <INPUT type="text" name="t2" onblur="document.f1.t2a.value=this.value,document.f1.t2b.value=this.value.length;"> <INPUT type="text" name="t2a"> <INPUT type="text" name="t2b"> <FORM> と、このような場合で10個も20個も同じ入力欄があった際に最もスクリプトを省略するには どのようにしたらいいのかがわかりません。 同じことを何度も繰り返し書くのは非効率に思えてならないのでどなたかいい方法をご存知の方の 知恵をお借りしようと思った次第です。よろしくお願いします。

  • name="shocd"はなんのタグでしょう。

    <input type="hidden" name="shocd" value="0002"> の中のname="shocd"というのは何を表しているのでしょうか。タグ辞典にも載っていないのでお願いします。

  • チェックボックスの表示・非表示 動作

    はじめまして。 初めて掲示板を利用させていただきます。javascriptを勉強しまだ日が浅いのでご存知の方がいらっしゃれば教えてください。 今、チェックボックスを選択し選択した項目がアクティブになるようにしたいのですが、選択項目が重複すると以下のようになってしまいました。 A+AB=AB A+AB+E=ABE 個々までは問題なし。 既に全てのチェックが付いた上体で、ABCE-A=BCE となってしまい、 ABのチェックが入っていても、Aが消えてしまいます。 以下に現在のコードを張ります。 <script type='text/javascript'> <!-- function fchk2(obj, name) { var frm=obj.form; if(obj.checked==true) { /* チェックボックスが選択されている場合は、   テキストボックスを有効化(false)*/ for(var i=1; i<=3; i++){ frm.elements[name+i].disabled=false; } } else { for(var i=1; i<=3; i++){ /* 無効化する前に、入力値をクリア */ if(name=='t'){ /* テキストボックスの場合 */ frm.elements[name+i].value=''; }else{ /* チェックボックスの場合 */ frm.elements[name+i].checked=false; } /* 無効化(true) */ frm.elements[name+i].disabled=true; } } } //--> </script> <form name='form2' action='#'> <input type='checkbox' name='chk1' value='1' onclick='fchk2(this,"t")' checked>A<br> <input type='checkbox' name='chk1' value='1' onclick='fchk2(this,"t");fchk2(this,"b");' checked>AとB<br> <input type='checkbox' name='chk1' value='1' onclick='fchk2(this,"t");fchk2(this,"e");' checked>AとE<br> <input type='checkbox' name='chk2' value='1' onclick='fchk2(this,"c");fchk2(this,"e");' checked>CとE<br> <br> A<input type='text' name='t1' value='テキストA'><br> A<input type='text' name='t2' value='テキストB'><br> A<input type='text' name='t3' value='テキストC'><br> <br> B<input type='text' name='b1' value='テキストA'><br> B<input type='text' name='b2' value='テキストB'><br> B<input type='text' name='b3' value='テキストC'><br> <br> <input type='checkbox' name='c1' value='1'> 選択肢C<br> <input type='checkbox' name='c2' value='1'> 選択肢C<br> <input type='checkbox' name='c3' value='1'> 選択肢C<br> <br> <input type='checkbox' name='e1' value='1'> 選択肢E<br> <input type='checkbox' name='e2' value='1'> 選択肢E<br> <input type='checkbox' name='e3' value='1'> 選択肢E </form> よろしくお願いいたします。

専門家に質問してみよう