重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

禁止ワードを設定して、その禁止ワードの一つと投稿内容が一致したら
投稿を拒否したくて以下のように記述したところ、
禁止ワードではない言葉でもエラーが表示されてしまいました。
どこか記述が違うのでしょうか?
@kinshi = ("アホ","バカ");#禁止ワードのリスト
if(($body)or($name)or($subject) = @kinshi){
&::error(\'禁止ワードが含まれています');{exit;}
}

A 回答 (3件)

前の質問で要求した補足の改善をせずにそのまま転記してもただの


マルチポストですよ。

とりあえず、簡単なサンプルを。

my @kinshi = ("アホ","バカ");
my $str = <<"TEXT";
普通の文です。
あいうえお
TEXT
my $str2 = <<"TEXT";
禁止ワードが含まれています。
アホ
TEXT

if(&word_ban($str, \@kinshi)) {
print "\$str: 禁止用語が含まれています。\n";
}
if(&word_ban($str2, \@kinshi)) {
print "\$str2: 禁止用語が含まれています。\n";
}

# 禁止キーワードが入っているかを調べる
sub word_ban {
my $str = shift;
my $word = shift;

# 間に余計な改行やスペースを入れて
# 投稿回避されないように削除しておく
# 全角スペース(SJIS: "\x81\x41")に対応
$str =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g;
return map { $str =~ /$_/m } @$word;
}

SJISのスキップする文字にSJISの全角スペースも入れてみましたが
他のエンコードの場合は動作しません。
あと、上記のスキップ部分はテストしていないので実は全部動作しない
可能性も。(^^ゞ
あとは、自分で該当スクリプトにマージしてください。
    • good
    • 0
この回答へのお礼

ご丁寧にどうもありがとうございます。
おかげさまで解決しました!(^-^)
間に余計な改行やスペースを入れて投稿回避できないようにする
なんてできると思わなかったので助かりました。

お礼日時:2008/08/05 11:08

あと、実際の所はどんなに工夫を凝らしても回避策はいくらでもある


ため、絶対に破られるのであまり信用しすぎない方がいいです。
あまり、条件を厳しくしすぎると普通の文まではじいてしまいますし。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
抜け道はあるというのはよく理解しております。
制限は厳しすぎないようにするつもりです。

お礼日時:2008/08/05 11:06

この if 文の条件は


・$body が空でない (かつ 0 でない) または
・$name が空でない (かつ 0 でない) または
・$subject に @kinshi の要素数を代入し, それが 0 でないとき
に成り立ちますが, それでいいですか?
普通は... grep でも使うかなぁ?
grep { $name =~ /$_/ } @kinshi
とやると, $name の中に @kinshi の要素のいずれかが含まれていれば非0 になります.
    • good
    • 0
この回答へのお礼

どうもありがとうございます!!
grepを使うなんて思いもつきませんでした。
勉強不足すぎると痛感しました。
おかげさまで解決することができました。

お礼日時:2008/08/05 11:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!