dポイントプレゼントキャンペーン実施中!

perlを使ってサイト上のhtmlを除去したいのですがその際、altやtitleなど属性の中にある文字列は除去せずにしたのです。
例えば下のようなimgタグがあります。
$str = '<img src="../images/example.png" alt="サンプル画像1" title="サンプル画像2" />テキスト';

これを正規表現をつかって除去し以下のようにテキストだけを取得したいのです。
サンプル画像1サンプル画像2テキスト

以下のような正規表現をつかって通常のhtmlタグは抜けるようになったのですが属性テキストを抜く方法がわかりません。
$str =~ s/<(".*?"|'.*?'|[^'"])*?>//g;

どなた様かご教授の程よろしくお願いいたします。

質問者からの補足コメント

  • ご返信ありがとうございます。
    目的としては、altとかtitleとかの属性も含めたテキストをページから抜き出したいのです。

    なので、srcの画像ファイル名とかは不要なんですね。

    よろしくお願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/08/17 00:38

A 回答 (5件)

s///eg でどうにかなりそうな気はするけど....



「『どうしたいのか』が完全な形で出てくるなら『どうすればいいのか』も完全な形で出せるかもしれない」としかいえないなぁ.
    • good
    • 0

No.2 & No.3のお礼欄を拝見しました。



そういった用途であれば、ライブラリを使用したほうが良いかと思います。
例えば↓のHTML::TagParser
http://blog.ryoana.com/entry/2015/09/29/213915


上のサイトは一例ですが、「perl html 解析」「perl スクレイピング」などで検索すれば他にも説明しているサイトがあると思います。
    • good
    • 0
この回答へのお礼

なるほどですね。こちらのモジュールを使って試してみます。

お礼日時:2016/08/17 12:04

こんな感じですか。


最初のカッコの中が$1に、二番目が$2に、三番目が$3に入ります。


my $str = '<img src="../images/example.png" alt="サンプル画像1" title="サンプル画像2" />テキスト';

$str =~ /<.*?alt="(.*?)".*?title="(.*?)".*?\/>(.*)/;

print "$1$2$3\n"; #→サンプル画像1サンプル画像2テキスト
    • good
    • 0
この回答へのお礼

ありがとうございます。

$str =~ /<.*?alt="(.*?)".*?title="(.*?)".*?\/>(.*)/;
print "$1$2$3\n"; #→サンプル画像1サンプル画像2テキスト
とした場合その<img>タグには有効かと思いますが、サイト上には<a>タグもあり<meta>タグもあります。
1ページ全部のソースからaltやtitleなどの属性、およびテキストを取得したいのです。

今回はわかりやすく省略して質問させていただいたのですがわかりづらく申し訳ございませんでした。

お礼日時:2016/08/17 10:43

やりたいことはだいたいわかるんだけど, 表現が曖昧なのでプログラムにしにくい.



例えば, #1 への補足で
「altとかtitleとかの属性も含めたテキストをページから抜き出したい」
「srcの画像ファイル名とかは不要」
とあるんだけど, 「テキスト」と「画像ファイル名」とはどう区別すればいい? 腐ったサイトで
<img src="../images/example.png" alt="../images/example.png" title="サンプル画像2" />
なんてあったらどうするの?

あるいは, 「alt や title の値は残す」「src の値はファイル名だから全部捨てる」ということかもしれんが, もしそうだとしたら他の属性はどうすればいい?
    • good
    • 0
この回答へのお礼

ありがとうございます。

>「テキスト」と「画像ファイル名」とはどう区別すればいい?
ややこしくてすみません。
その区別はする必要はないです。とにかくaltとかtitleとかの中は残し、それ以外のタグは取り除きたいです。

>もしそうだとしたら他の属性はどうすればいい?
実を言うと<img>タグの場合はaltとかtitleになりますがその他にも抜き出したい属性はあります。
例えば、<meta name="Description" content="*****">などがあった場合、contentの部分も抜き出したいのです。
ちょっと省略してしまい申し訳ないです。

サイトのソースより日本語テキスト(もちろん英単語なんかも含めますが)を抜き出したいのです。

よろしくお願いいたします。

お礼日時:2016/08/17 10:37

ちょっと質問.



結果が
サンプル画像1サンプル画像2テキスト
というのは, どういう理由でしょうか? 「altやtitleなど属性の中にある文字列は除去せずに」を正確に実行すると
../images/example.pngサンプル画像1サンプル画像2テキスト
とならなければおかしいのではありませんか?
この回答への補足あり
    • good
    • 0

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