
与えられた文字列から、対応するタグに囲まれた部分文字列を順次抜き出していく簡潔なプログラムの書き方を探しています。
例えば、注目するタグが <b> と </b> の場合、文字列 "<b>word1</b> word2 <b>word3 word4</b>" が与えられたとき、部分文字列 "word1"、"word3 word4" を順次抜き出すようなプログラムで、特に簡潔な考え方で書かれたものに関心があります。
ただ、"<b><b>word1</b> word2 <b>word3 word4</b></b>" のように、部分文字列が他の部分文字列に埋め込まれた形を含む場合には、例えば、"word1", "word3 word4", "word1 word2 word3 word4" のように、文字列左端の方からタグを含まない部分文字列を抜きだすようなプログラムは簡潔に書けないものでしょうか?
例えば以下のようにすれば文字列右端の方から処理できると思うのですが、このような感じで、文字列左端の方から処理していくプログラムというのは書けないものかと思いました。
while($input=~s/(.*)<b>(.*?)<\/b>/$1$2/) {
print "$2\n"
}
よろしくお願いいたします。
No.2
- 回答日時:
HTMLの解析というより、対応するタグに囲まれた部分文字列を順次抜き出していくというのであれば、
Perl5.8の標準モジュールText::Balancedを使うといいと思います。
perldoc Text::Balanced
して貰えばいいと思いますが、なかなかわかりにくいと思うので、
サンプルを作ってみました。
---------------------------------------------------------------
use Text::Balanced qw(extract_bracketed extract_tagged);
$data="<b><b>word1</b> word2 <b>word3 word4</b></b>";
&extract($data);
sub extract($){
my $text = shift;
my ($match,$rest,$prefix,$start,$content,$end);
while(($match,$rest,$prefix,$start,$content,$end)=extract_tagged($text, '<b>', '</b>','[^<]*')){
last if $match eq ""; #マッチしなくなった
&extract($content); #ネストの処置
$content =~ s/<\/?b>//g; #表示用にタグ削除
print "$content\n";
$text=$rest; #残りのマッチをさせる準備
}
}
----------------------------------------------------------------
サンプルでは、printしてますけど、必要なら配列にpushすればいいと思います。
また、extract_bracketedで対になるカッコへのマッチングを扱えます。(日本語の「」を扱うためにはextract_taggedの方が良いかも知れません)
あと、用途によって、同類の関数が他にも含まれています。
回答、それに丁寧な例と説明まで書いていただいてありがとうございます。
Text::Balanced という便利なものがあるのですね。いつも回答を参考にさせていただいているのですが、今回も参考になりました。
ありがとうございました。
No.1
- 回答日時:
HTML::Parserや、HTML::TreeBuilderを使って、HTMLの構造解析を行った上で、情報抽出してみては。
アドバイスありがとうございます。
タグの種類が少ない場合(例えば、<b>と</b>だけのとき)、ごく簡潔な正規表現で用が足りるのではないかと考えたのですが、よい考えが浮かびませんでした。
<b>...</b>に限らず、例えば、(...)や「...」の場合についての方法に関心があるのですが、<b>...</b>の場合の方が、より一般的な形の回答をいただけるかと思いそのように質問してしました。
いずれにしても、アドバイス大変ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
perlをバージョンアップしたら...
-
Perlで時間の計算
-
Wallpaper Engineでおすすめの...
-
Perl言語について。
-
perlで2次元配列をサブルーチ...
-
Strawberry Perl for Windows ...
-
#!/usr/bin/perlで書きだしたCG...
-
perl の open について教えてく...
-
INDIRECT 横に再度抽出したい
-
アルファベットに付いて質問し...
-
openした後、closeしないでプロ...
-
画像が表示でnull; this.src
-
VBA変数をFunction.VLookupの戻...
-
perlのflock関数でロックをかけ...
-
Perl の外部モジュールの利用方法
-
TeraPadエディターの操作方法に...
-
bashスクリプト
-
perlの構文でカンマの意味が分...
おすすめ情報