• ベストアンサー

条件一致の方法

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

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • 禁止ワードの設定

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

    • 締切済み
    • CGI
  • 条件分岐について

    # 禁止文字 @haijyo = ('jp','JP','JP','jp','com','COM','COM','com','net','NET','net',); foreach $haijyo (@haijyo) { if($body =~ /$haijyo/){ push(@error, '本文にメールアドレスやURLの記入はできません。または禁止ワードが含まれています') } } を禁止ワードが本文($body)に含まれており なおかつユーザーエージェントにwindowsが含まれていた(いずれも一致した)場合、 エラーを吐き出すようにしたくて elsif($ENV{'HTTP_USER_AGENT'} =~ /windows/)を書きくわえてみたのですがうまくいきません。 どのようにしたら両方の条件式に一致した場合にエラーを吐き出せるのでしょうか?

    • ベストアンサー
    • Perl
  • 現在アクティブなワークブック名によって条件分岐させたいのですが

    現在アクティブにしているワークブック名によって条件を分岐させたいのですが、下記のように記述すると「型が一致しません」とエラーが出てしまいます。これは何がおかしいのでしょうか。 (デバックモードでIf~Thenまでが黄色でマークされます) Excel2000を使用しています。よろしくお願いします。 Dim t As Single If ActiveWorkbook.Name="AAA.xls" Or "BBB.xls" _ Or "CCC.xls" then t=3.5

  • 型が一致しません

    いつもお世話になっております。 シートごとに元データの値でフィルタをかけ、 フィルタした各シートのD列の文字列を照らし合わせて整合性を確認したく、 下記のようなVBAをつくりましたが、ここで↓ If name_A <> name_B <> name_C <> name_D Then 型が一致しませんとエラーになります。 どなたかアドバイスをお願いいたします。 Sub 不整合チェック()  'フィルター  Worksheets("Aリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3")  Worksheets("Bリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3")  Worksheets("Cリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3")  Worksheets("Dリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3") '整合性チェック  Dim name_A As String  Dim name_B As String  Dim name_C As String  Dim name_D As String  name_A = Worksheets("Aリスト").Cells(65536, 4).End(xlUp).Value  name_B = Worksheets("Bリスト").Cells(65536, 4).End(xlUp).Value  name_C = Worksheets("Cリスト").Cells(65536, 4).End(xlUp).Value  name_D = Worksheets("Dリスト").Cells(65536, 4).End(xlUp).Value  If name_A <> name_B <> name_C <> name_D Then   MsgBox "データ不整合を発見しました。 処理を中断します。", vbCritical   Exit Sub  ElseIf mykouiji_kouji = name_nyukin = name_kokyaku = name_uriage Then   MsgBox "問題なし。"  End If End Sub

  • ファイルサイズ 取得 一致 PHP

    formに入力されたファイルサイズが一致しているか確認したいです。 よろしくお願いします。 php $filesize = ''; $filesize = filesize($_FILES['upfile']['tmp_name'] ); if ($filesize !== ($_POST["size_name"])){ echo "ファイルサイズの値が一致しません"; exit; }

    • ベストアンサー
    • PHP
  • Perl 禁止語句

    テキストの中に禁止語句一覧があります。 それと一致した場合、エラーを返すのですが、 現在のコードですと、 完全一致で、これを部分一致にする 方法を教えてください。 またコードの指摘があればよろしくお願いいたします! ◆ngword.txt◆ あい いう うえ えお ・ ・ ・ 1000行ほど(もっとあるかもしれません) ◆test.pl◆「UTF-8」 #/usr/bin/perl use Encode; my $Name = "え"; $Name = encode('cp932', decode('UTF-8', $Name)); open my $fh, '<', 'ngword.txt'; chomp(@ngword = <$fh>); if(&ban($Name, \@ngword)) { print "error\n"; } sub ban { my $body = shift; my $word = shift; $body =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g; return map { $body =~ /$_/m } @$word; }

    • ベストアンサー
    • Perl
  • cshの条件式について教えてください

    cshで該当ディレクトリにファイルがなければOK、あればエラーというような処理をしようと思っています。 しかし、下記のような記述ではうまくできません。 1) *************************** if ( -e $DIR/*.* ) then echo "NG" exit 1 else echo "OK" endif exit 0 *************************** if文でなく、外にだせばうまくいくのですが... 2) *************************** test -e $DIR/*.* if($status == 0) then echo "NG" exit 1 else echo "OK" endif exit 0 **************************** if ( test -e $DIR/*.* ) then... でもだめでした。 どうにかしてif文で一発判定をしたいと思っているのですが、正しい記述方法を教えてください。 よろしくお願いします。

  • メール送信で文字化け

    メール送信で件名が文字化けしてしまいます。 カテゴリ内には同様の質問もあるようですが、 解決できないので、投稿しました。 以下のようなコードです。 $to= "aa@aa.aa"; $from= "bb@bb.bb"; $subject= "メール送信テスト"; $headers= "From:$from"; $subject = i18n_mime_header_encode(i18n_convert($subject, "JIS")); $name= $_POST["name"]; $sub= $_POST["sub"]; $body= $_POST["body"]; $message="$name \n $sub \n $body \n"; if(mail($to, $subject, $message,$headers)){ echo "送信完了"; }else{ echo "送信エラー"; } ちなみに、 $subject= base64_encode($subject); とかもやってみたけど駄目でした。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • if文についてです

    アンケート入力の際、if文で5ヵ所のうちひとつでも空欄の場合「未記入です」と表示させたいのですが、下記のプログラミングでは半角数字でアンケート欄に入力すると上手くいくのですが日本語でアンケート欄に入力すると未記入のエラーがでます。原因はなぜなのでしょうか? (cgiファイルの一部分です) if($name == "" or $address == "" or $day == "" or $month == "" or $year == "" ){ $error1 ="未記入項目があります"; &Error; exit; } exit; sub Error{ print<<FORM; <html> <head> <title>空欄エラー</title> </head> <body> $error1 <form action="okweb.cgi"> <input type="submit" value="戻 る"> </form> </body> </html> FORM }

    • ベストアンサー
    • Perl
  • mysqlで文字列が一致した数を求め並べ替えたい

    name | keyword   --------------------- イチゴ | 果物,赤,甘い,春 レモン | 果物,黄色,酸っぱい,種あり,柑橘類 ミカン | 果物,橙,甘い,酸っぱい,柑橘類,冬,こたつ ブドウ | 果物,紫,甘い,皮あり,種あり,ワイン 人参  | 野菜,橙,固い 大根 | 野菜,白,おでん,冬 このように、キーワードをコンマで分けているテーブルがあるとします。 例えば「果物」「甘い」「種あり」の三つのワードでkeywordを検索した時 name ------- ブドウ  (3ワード一致) イチゴ  (2ワード一致) ミカン  (2ワード一致) レモン  (1ワード一致) 上のように一致するキーワードが多い順に表示させたいのですがうまくいきません select name from tb where keyword like '%果物% or keyword like '%甘い% or keyword like '%種あり% order by count(name); これだと上手くいきませんが、意味的にはこのようにしたいと思ってます。 joinで同じテーブルを結合しても思うように行きませんでした。 何か良い方法があればご教授お願いいたします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう