![]() |
カレッヂ |
質問者 哲やん
投稿日 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裏技 |