ある文字列中に次のほぼ同値な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で質問しましょう!
似たような質問が見つかりました
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
perlのrequireの動き方について...
-
Perl の外部モジュールの利用方法
-
Windows10においての『Perl』の...
-
Perlで特定文字列から特定文字...
-
Perlでsprintf("%02d",$month)...
-
フローチャート 九九
-
perl LWPでURLにアクセスした時...
-
Perlで、「が」を、「...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
Perlで特定文字列から特定文字...
-
Wallpaper Engineでおすすめの...
-
Perlのエラーについてご教授く...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
テキストファイルで提出とは?
-
Perl の外部モジュールの利用方法
-
#!/usr/bin/perlで書きだしたCG...
-
Windows10においての『Perl』の...
-
perlのflock関数でロックをかけ...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
画像が表示でnull; this.src
-
ターミナルで特定の文字と文字...
-
英数文字列のうちの数値を4桁に...
おすすめ情報