与えられた文字列から、対応するタグに囲まれた部分文字列を順次抜き出していく簡潔なプログラムの書き方を探しています。
例えば、注目するタグが <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で質問しましょう!
似たような質問が見つかりました
- PDF 「PDF文書を簡単にWordで編集する方法」と 罫線が 図形で出力されるのは? 6 2022/06/14 06:51
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Word(ワード) 表の縦罫線を移動するピッチ 1 2022/10/12 12:24
- その他(パソコン・周辺機器) WINDOWS11 IMEの日本語入力で困っています 4 2023/04/29 19:24
- PDF acrobatでwordファイルをpdfに変換すると文字化けする 3 2023/02/10 09:31
- Word(ワード) Wordに関して詳しい方教えてください。 Wordで文章を打つ際、写真のように、本文のところに文字が 4 2022/05/23 00:51
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- その他(ソフトウェア) 簡単な絵が描けるソフト(wordに挿入) 3 2022/05/20 22:16
- Word(ワード) Word 大学のレポートをWordで書いて提出したんですけど、提出したものを見るとWordファイルの 4 2022/04/17 18:00
- Visual Basic(VBA) evcel VBAについて 2 2022/08/02 21:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl の外部モジュールの利用方法
-
ファイルアイコンの左下に緑の□...
-
perlのプログラミング 部分入れ...
-
ペプシコーラとコカ・コーラとD...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
-
Blenderについて
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
-
英数文字列のうちの数値を4桁に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Perl の外部モジュールの利用方法
-
Perlで特定文字列から特定文字...
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで2次元配列をサブルーチ...
-
TeraPadエディターの操作方法に...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
perlでリテラル値はメモリにど...
-
画像が表示でnull; this.src
おすすめ情報