アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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";
}
}

参考URL:http://homepage3.nifty.com/hippo2000/perltips/ht …
    • good
    • 0
この回答へのお礼

パーサを使うといいのですね。
先ほど、cgi-lib.plの中身を眺めながら
正規表現で解決しようと四苦八苦していました..

実を言うと使っているのはPHPなので、XML Parser 関数あたりを
利用すればいいのでしょうか。
いろいろ調べてみます.

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

お礼日時:2005/09/22 02:36

正規表現だと、こういう解析が困難です。


自分で解析するのもいいけど、モジュールを使うと楽ちん
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";
}
}
    • good
    • 1
この回答へのお礼

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

またよろしくお願いします。
ありがとうございました。

お礼日時:2005/09/22 02:39

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