ある文字列中に次のほぼ同値な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>タグの中の"と"の間に > が含まれる場合に正しく動作しません。
何いい方法はないでしょうか.
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/ht …
パーサを使うといいのですね。
先ほど、cgi-lib.plの中身を眺めながら
正規表現で解決しようと四苦八苦していました..
実を言うと使っているのはPHPなので、XML Parser 関数あたりを
利用すればいいのでしょうか。
いろいろ調べてみます.
ありがとうございました。
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";
}
}
#2さん、度々お世話になってます。
何かと正規表現を使う癖がついていたので、大変参考になりました。
またよろしくお願いします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで文字の置換又は抽出に関...
-
perlの構文でカンマの意味が分...
-
サクラエディターの設定の仕方...
-
perl このテキストファイルを簡...
-
Raspberry Pi
-
VB.net
-
テキストファイルで提出とは?
-
perl 正規表現でエラー
-
Perlで、「が」を、「...
-
プログラミングでポインタの勉...
-
perlで自動ログインをしたいが...
-
Perl言語について。
-
perlで2次元配列をサブルーチ...
-
画像が表示でnull; this.src
-
Perlで特定文字列から特定文字...
-
C言語の問題について
-
PerlでUTF-8のファイルの文字列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
Perlのエラーについてご教授く...
-
Perlで特定文字列から特定文字...
-
画像が表示でnull; this.src
-
Wallpaper Engineでおすすめの...
-
Perl言語について。
-
perl LWPでURLにアクセスした時...
-
Perlで時間の計算
-
Perlで、「が」を、「...
-
ファイルアイコンの左下に緑の□...
-
Perl の外部モジュールの利用方法
-
このファイルを開く方法で困っ...
-
perlで2次元配列をサブルーチ...
-
Windows10においての『Perl』の...
おすすめ情報