- ベストアンサー
条件一致の方法
禁止ワードを設定して、その禁止ワードの一つと投稿内容が一致したら 投稿を拒否したくて以下のように記述したところ、 禁止ワードではない言葉でもエラーが表示されてしまいました。 どこか記述が違うのでしょうか? @kinshi = ("アホ","バカ");#禁止ワードのリスト if(($body)or($name)or($subject) = @kinshi){ &::error(\'禁止ワードが含まれています');{exit;} }
- みんなの回答 (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の全角スペースも入れてみましたが 他のエンコードの場合は動作しません。 あと、上記のスキップ部分はテストしていないので実は全部動作しない 可能性も。(^^ゞ あとは、自分で該当スクリプトにマージしてください。
その他の回答 (2)
- pick52
- ベストアンサー率35% (166/466)
あと、実際の所はどんなに工夫を凝らしても回避策はいくらでもある ため、絶対に破られるのであまり信用しすぎない方がいいです。 あまり、条件を厳しくしすぎると普通の文まではじいてしまいますし。
お礼
どうもありがとうございます。 抜け道はあるというのはよく理解しております。 制限は厳しすぎないようにするつもりです。
- Tacosan
- ベストアンサー率23% (3656/15482)
この if 文の条件は ・$body が空でない (かつ 0 でない) または ・$name が空でない (かつ 0 でない) または ・$subject に @kinshi の要素数を代入し, それが 0 でないとき に成り立ちますが, それでいいですか? 普通は... grep でも使うかなぁ? grep { $name =~ /$_/ } @kinshi とやると, $name の中に @kinshi の要素のいずれかが含まれていれば非0 になります.
お礼
どうもありがとうございます!! grepを使うなんて思いもつきませんでした。 勉強不足すぎると痛感しました。 おかげさまで解決することができました。
お礼
ご丁寧にどうもありがとうございます。 おかげさまで解決しました!(^-^) 間に余計な改行やスペースを入れて投稿回避できないようにする なんてできると思わなかったので助かりました。