Perl覚え書き20041121

 昨日の内容と関連していると思う。たぶん。

 まあこれは特にblogに限ったことではなくて掲示板やチャットでも必要なことだけど、書き込み内容や発言内容で一部のHTMLタグを使用可能にしたいときどうすればいいか。

 あ…そういえば他のCGIではどういう風に実装しているのか全然見てなかった…。それは今度見てみると言うことで。

 作業の順番としてはこれが最初にやったことじゃないけどまあそんな細かいことはおいといて。

 まず、たとえば <a href="abc.html" target="_blank"> と言うタグがあって、これをスペースで分けて配列に格納してあるものとする。<や>は除去してあるという前提で。

 ここでこの「Aタグ」が許可されているのか、「href」という属性は使えるかどうかを調べたい。どうすればいいか。次のような連想配列を用意する。

my %allow_tags = (
	'a' => {
		'href' => 1,
		'target' => 1,
		'name' => 1,
	},
	'img' => {
		'src' => 1,
		'border' => 1,
		'width' => 1,
		'height' => 1,
	},
);

 連想配列の中に連想配列が入っていて…二重連想配列とでも呼ぶんだろうか?実際の所、あまりよく分かっていないけどまあこうすれば動くってことで良しとしてしまう。

 'a' => 'href:target:name' とでもしてsplitで分けて使ってもいいのかもしれないけど、上記の方法だと分ける手間が省けるから楽なんじゃないかと。

 で、これの使い方。

$tag = 'a';
$att = 'href';

print "ok" if $allow_tags{$tag}{$att};

 $allow_tags{$tag}->{$att}と書いてもいける。と言うか逆に上記のやり方でも出来る、のかも?$tagが許可されているか調べたければif $allow_tags{$tag}だけでOK。簡単ですねー。

 実際の所、ここよりもタグを分解する部分の方が難しい。一応ある程度形にはなってるけど、まだあまりテストしてないし。

 この部分の最終目標というのは、与えられた一連の文章(たとえばblogの文章だったりBBSへの書き込み内容だったりチャットの発言内容だったり)を、許可されたタグ、属性だけを通し、許可されていない属性は削除、同じくタグは&lt; &gt;に変換して返す、と言う物。

 可能な限り、許可されていないタグ/属性以外の部分には変更を入れないというのが理想なんだけど、改行の扱いがちと面倒なような。普通に使われる改行は問題ないものの、タグの途中で改行が入ったり(まあこれは改行を削除しても問題なさそうだけど)、あと一番難点なのがコメント部分。まあblog/BBS/chatの文中でコメントなんて…ってことでごっそり切ってしまってもいいんだけど…。

 さて、どうなることやら。

 と。実はこのルーチン、特に必要があって作る訳ではない。はてなでも使用可能なタグと不可能なタグがあって、どういう処理をしているのかは分からないけど中でゴソゴソやって分類されて出てきている。ふと、それはどうやったら出来るのかなってことが頭をよぎったんで、それじゃあちとやってみようかなと。それだけの話。

 なわけで完成するのか、進み具合はどうなのかはよく分からない。よく分からないからこれの続きがあるのかも分からない。でも出来るだけ書けるようにがんばってみる。