人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perl 特定のHTMLタグ以外を削除する正規表現またはperlモジュールを教えてください。
例ではemは許可、それ以外のタグは不許可とする。
<em>hoge</em>を<em>hoge</em>とする
<textarea>hoge</textarea>をエスケープして&lt;textarea&gt;hoge&lt;/textarea&gt;としたいです。

●質問者: peppon
●カテゴリ:ウェブ制作
✍キーワード:EM hoge HTML Perl エスケープ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● andi
●20ポイント

考え方としては一度すべてのタグを不許可にした後、必要なタグだけ許可するやり方が良いかと思います。


# h1とh2を許可

@ok_tags = qw(h1 h2);


$html = ’

<html>

<head>

<title>abc</title>

</head>

<body>

<h1>aaa</h1>

<h2 class=”bbb”>bbb</h2>

</body>

</html>

’;


$html =~ s!<!&lt;!g;

$html =~ s!>!&gt;!g;


# 正規表現を作成(許可したタグを又は(|)で連結)

$ok_tags = join(’|’,@ok_tags);


# 許可したタグを戻す

$html =~ s!&lt;(($ok_tags)[^>]*)&gt;(.*?)&lt;(/¥2)&gt;!<$1>$3<$4>!gsi;


print $html;

◎質問者からの返答

ありがとうございます。

ただa href や img srcの場合だとうまくいきません。どのようにすればいいですか。


2 ● andi
●10ポイント

私の手元ではhref=””が付いた場合も変換できていますが・・・


> &lt;(($ok_tags)[^>]*)&gt;


の「[^>]*」の部分でその処理を行ったつもりでした。

◎質問者からの返答

ええとうまくいかないというのは a href img srcを許可したい場合です。@ok_tagsにはどのように記載すればいいですか。


3 ● kimbara
●10ポイント

こんな感じでしょうか?

この例では、<a>?</a>タグを抽出します。


open FILE, $path;

undef $/;

$data = <FILE>;

close FILE;

while($data =~ /(<a(>| ).*?<\/a>)/) {

print ”$1\n”;

}


注意:処理系によって「\」の部分は円記号にする必要があります。


4 ● aki73ix
●30ポイント

http://nifberry.727.net/test/hatena134.cgi

<em>?</em>と

と<a ?>?</a> を許可、他を不許可にするサンプルです

いかがでしょうか?


#!/usr/local/bin/perl

print qq(Content-type: text/html¥n¥n);

print "<html><body>¥n";

$strings="<em>hoge</em>を<br>そのまま<em>hoge</em>とする¥r¥n<textarea>hoge</textarea>などを<a href=¥"http://www.hatena.ne.jp/¥">エスケ</a><br>";

# そのまま表示するTAG <を ¥x01 に >を ¥0x02に置換しておく

# 例: $strings=~s/<TAG>/¥x01¥TAG¥x02/g;


# <em>もにょもにょ</em>をそのまま

$strings=~s/(<em>)(.*?)(<¥/em>)/¥x01em¥x02¥2¥x01¥/em¥x02/g;

# <a ?>もにょもにょ</a>をそのまま

$strings=~s/(<a )(.*?)(>)(.*?)(<¥/a>)/¥x01a ¥2¥x02¥4¥x01¥/a¥x02/g;

# <br>をそのまま

$strings=~s/<br>/¥x01br¥x02/g;


# 指定しないタグはすべて表示

$strings=~s/</&lt¥;/g;

$strings=~s/>/&gt¥;/g;

# 元に戻す処理

$strings=~s/¥x01/</g;

$strings=~s/¥x02/>/g;


print $strings;

print qq(</BODY></HTML>);

exit;

◎質問者からの返答

の場合は無理でしょうか?


5 ● aki73ix
●20ポイント

http://nifberry.727.net/test/hatena134a.cgi

<img もにょもにょ>の場合も応用で同じです


$strings=~s/(<img )(.*?)(>)/¥x01img ¥2¥x02/g;


これを追加してください


正規表現については、下のサイトを参考にすると良いです

()でくくった者をグループにしてパターンマッチしたものを順番に ¥1 ¥2 ¥3 ¥4 と表現できます


$strings=~s/(<img )(.*?)(>)/¥x01img ¥2¥x02/g;


の場合は <img の部分が ¥1

src=”” height=””などの部分が ¥2

> が ¥3 になるわけです

http://takenaka-akio.cool.ne.jp/doc/perl_kiso/match2.html

TAKENAKA's Web Page: Perl入門

◎質問者からの返答

うまくいきましたありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ