CGI-BBS > 電子掲示板 > Trees > 禁止語の設定


カレッヂ
カレッヂ


質問者 哲やん  投稿日 5/17(木) 15:42:34
いくつかの言葉を書き込み禁止したいのですが、どの様に改造したら良いのでしょうか?
別スクリプトを読み出す方法でも結構ですし、trees.cgi内に組み込む形でも良いのでどなたか教えてください。
回答者 まさ  [削除]  投稿日 5/17(木) 19:23:22
その禁止語を配列にでも入れておいて、ひとつずつその言葉が含まれているか調べていけば
よいでしょう。

あるいは禁止語をファイルにして、そのファイルを配列に読み込んで調べると言うのもいけ
るでしょう。

速度的には最初から配列に入れている方が早いですが、その禁止語が多くなければあまり気に
する必要はないでしょう。

わたしならメンテナンスのことも考えてファイルにしますが。

回答者 呑兵衛  [削除]  投稿日 5/18(金) 16:44:28
呑兵衛といいます。

まささんの「配列」を具体的に書くと

@kinshi = ('AAA', 'BBB', 'CCC');
foreach (@kinshi) {
if (/^$/) { next; }
if ($in{'value'} =~ /$_/i) { &error('禁止語があります','*********'); }
}

ですね。

AAA BBB CCC が禁止対象文字列、*****は任意の文字で
trees.cgiのsub write 中の
if ($in{'value'} eq '') { &error('入力不備','内容が書かれていません.'); }

$host = &gethost;
の間に置いてみるとか。
回答者 まさ  [削除]  投稿日 5/20(日) 13:11:51
このスクリプトだと文字コードがSJISだとしてその禁止語に日本語が含まれていると仮定した
場合、誤動作します。禁止語が全て半角英数なら問題ないでしょう。

実は正確に日本語にマッチさせるのは案外難しいのです。
ですからわたしはあえてスクリプトを記載しませんでした(^^ゞ

では文字コードをEUCにすればいいのではないかと言うことも考えられますが、これでも上手く
いきません。今度は別の問題が出てきます。

文字コードがSJISだとすると$_に「タ」「ー」「表」などがあるとダメですね。
ようは/$_/ の正規表現にメタ文字に該当するコードが含まれてしまうと誤動作します。

\Q \E で$_を挟む(これによりその間のメタ文字を無効化します)か、正規表現を用い
ずindex()を使うことで対処可能かもしれません。

詳しくは以下を見てください。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match

質問者 哲やん  [削除]  投稿日 5/20(日) 14:24:46
まさ様、呑兵衛様、ご指導ありがとうございました。

ご指導通りにターゲットをeucに変換し、以下のような処置を行いました。
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

# チェック対象をEUCに変換
$target = $in{value};
&jcode'convert(\$target, 'euc', 'sjis');

foreach $word(@WORDCHECK) {
  if ($target =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$word)/) {
    &error('書き込みが出来ません','管理者より指定された語句が含まれています');

これらの処理を含めてスクリプトの改造を行ない、今のところ正常に作動しているようです。
大変参考になるサイトをお知らせ頂きありがとうございました。

返信(回答)する


Web裏技