• ベストアンサー

条件一致の方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.2

前の質問で要求した補足の改善をせずにそのまま転記してもただの マルチポストですよ。 とりあえず、簡単なサンプルを。 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の全角スペースも入れてみましたが 他のエンコードの場合は動作しません。 あと、上記のスキップ部分はテストしていないので実は全部動作しない 可能性も。(^^ゞ あとは、自分で該当スクリプトにマージしてください。

masa-25
質問者

お礼

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

その他の回答 (2)

  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

あと、実際の所はどんなに工夫を凝らしても回避策はいくらでもある ため、絶対に破られるのであまり信用しすぎない方がいいです。 あまり、条件を厳しくしすぎると普通の文まではじいてしまいますし。

masa-25
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

masa-25
質問者

お礼

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

関連するQ&A