perl 特定のHTMLタグ以外を削除する正規表現またはperlモジュールを教えてください。

例ではemは許可、それ以外のタグは不許可とする。
<em>hoge</em>を<em>hoge</em>とする
<textarea>hoge</textarea>をエスケープして&lt;textarea&gt;hoge&lt;/textarea&gt;としたいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/08/11 16:40:36
  • 終了:--

回答(5件)

id:andi No.1

andi回答回数448ベストアンサー獲得回数02005/08/11 16:51:40

ポイント20pt

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


# 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;

id:peppon

ありがとうございます。

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

2005/08/11 17:04:25
id:andi No.2

andi回答回数448ベストアンサー獲得回数02005/08/11 17:10:49

ポイント10pt

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


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


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

id:peppon

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

2005/08/11 17:16:27
id:kimbara No.3

kimbara回答回数638ベストアンサー獲得回数132005/08/11 17:37:08

ポイント10pt

こんな感じでしょうか?

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


open FILE, $path;

undef $/;

$data = <FILE>;

close FILE;

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

print ”$1\n”;

}


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

id:aki73ix No.4

aki73ix回答回数5224ベストアンサー獲得回数272005/08/11 18:15:05

ポイント30pt

<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;

id:peppon

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

2005/08/11 18:25:38
id:aki73ix No.5

aki73ix回答回数5224ベストアンサー獲得回数272005/08/11 18:38:08

ポイント20pt

<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 になるわけです

id:peppon

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

2005/08/11 19:12:57

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません