• ベストアンサー

条件分岐について

# 禁止文字 @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
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

No.1 さんのおっしゃる通りなんですが、計算負荷とかその他もろもろを考えると、 if($ENV{'HTTP_USER_AGENT'} =~ /windows/i) { @haijyo = ('jp','JP','JP','jp','com','COM','COM','com','net','NET','net',); foreach $haijyo (@haijyo) { if($body =~ /$haijyo/){ push(@error, '本文にメールアドレスやURLの記入はできません。または禁止ワードが含まれています'); last; } } } の方が良いんじゃあ無いかと思います。 変えたところは、以下の 3点です。 1 HTTP_USER_AGENT条件では、"windows" に大文字を含んでもひっかかる様にした。 2 HTTP_USER_AGENT条件をパスした場合は無駄な BODYをチェックしない。 3 BODY中に NGワードが複数あっても同じエラーメッセージを複数出さない。 P.S. NGワード、厳しすぎないですか? ・価格COM ・computer ・InternetExplorer

masa-25
質問者

お礼

どうもありがとうございます! この方がすっきりしていていい方法だと思いました。 エラーメッセージが複数出ても意味なのですし。 NGワード厳しいとは思うんですが、最近違法なサイトの宣伝が頻発しており、いたしかたない状況なのです。

その他の回答 (2)

  • ruri6syo
  • ベストアンサー率42% (9/21)
回答No.3

ご質問の主旨と違っていてもうしわけありません。 No.2さんの仰るとおり、禁止Wordが厳しすぎるのではないでしょうか。このままですと、普通の言葉にも禁止が出てしまいます。 主にメールアドレスとURLに制限をかけたいのであれば、アドレスにしか使われない@やhttp:/などを排除対象にしてはいかがでしょう。 URLばかりが羅列された迷惑書き込みの殆どは、http:から書き始められていますし。メールアドレスの@は、顔文字などでも使われるので、文字クラスを使って、アルファベットor数字に挟まれているもののみを排除するようにしてはどうでしょうか。(顔文字の場合、記号と隣り合っていることがほとんど) @haijyo = ('http:/','\w@\w'); とか。いかがですか?

masa-25
質問者

お礼

ご指摘ありがとうございます。 実はそのように禁止ワードを設定していたのですが、 違法なサイトが宣伝のために書き込みをする際に httpやwwwを省いて書き込みをしてくるため、困っていた次第です。

noname#77845
noname#77845
回答No.1

「いずれも一致した場合」 なら、elsif じゃだめでしょ。 elsif にくるときは、最初の条件が偽だったときですから。 if($body =~ /$haijyo/ and $ENV{'HTTP_USER_AGENT'} =~ /windows/){ なら、両方とも真の時に{}内が実行されるんじゃないですか。

masa-25
質問者

お礼

ご指摘ありがとうございます。 たしかにそうですね。

関連するQ&A

  • 書き方を教えてください

    まだ初心者なのですが、 if($ENV{'HTTP_USER_AGENT'} =~ /UP.Browser/) { unless($ENV{'HTTP_X_UP_SUBNO'} =~ /.ezweb.ne\.jp$/) { push(@error, '番号を通知して下さい。'); } } という構文を作りました。 ($ENV{'HTTP_X_UP_SUBNO'} =~ /.ezweb.ne\.jp$/) もしくは unless($ENV{'HTTP_USER_AGENT'} =~ /SN/) の時に push(@error, '番号を通知して下さい。'); と言うように書きたいのですが、どう書いて良いかわかりません。 どなたか教えてください。

    • ベストアンサー
    • Perl
  • いくつかの条件に不一致の処理

    {$CNF::pda{'browser'}{'agent'}{'list'}}というユーザーエイジェントのリストがあり、 そこに7つ登録されていて 7つすべてが条件不一致の場合に 以下のような構文だとホームというリンクが7回表示されてしまい困っています。 7つの条件不一致であった場合でも 1回しか(ホームへのリンクを1回しか表示しない)実行ようにしたいのですが どのようにしたらいいのか具体的に教えてください。 どうかよろしくお願いいたします。 foreach (@{$CNF::pda{'browser'}{'agent'}{'list'}}) { length($_) or next; unless (index($ENV{'HTTP_USER_AGENT'}, $_) != -1) { push(@menu, qq|<a class=Menu href="$CNF::base{'home'}{'url'}">ホーム</a>|);}}

  • orとelsif

    質問があります。 HTTP_USER_AGENTによって携帯端末とPC端末を振り分けるCGIを製作中です。 その際に疑問に思ったのですが、 if(($ENV{'HTTP_USER_AGENT'} =~ /***/i) or ($ENV{'HTTP_USER_AGENT'} =~ /***/i) or.....{ ~~~ } のように1行でorで繋げる方法と if($ENV{'HTTP_USER_AGENT'} =~ /***/i){ ~~~ } elsif($ENV{'HTTP_USER_AGENT'} =~ /***/i){ ~~~ } のようにelsifで繋げる方法とどちらが効率がいいのでしょうか? メモリの消費 サーバーへの負担 処理の速度 を中心にお願いします。

    • ベストアンサー
    • Perl
  • リダイレクト転送について

    URL一つで使用端末の種類別のURLに飛ばしたいのですが CGIぼんさんのところのUser Agent を使った方法のを採用したいと考えています。 # User Agent によるキャリア判別 @user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'}); if ($user_agent[0] eq 'ASTEL') { # ドットi 用の処理 } elsif ($user_agent[0] eq 'UP.Browser') { # EZweb 旧端末用の処理 } elsif ($user_agent[0] =~ /^KDDI/) { # EZweb WAP2.0 対応端末用の処理 } elsif ($user_agent[0] eq 'PDXGW') { # H" 用の処理 } elsif ($user_agent[0] eq 'DoCoMo') { # i-mode 用の処理 } elsif ($user_agent[0] eq 'J-PHONE') { # J-SKY 用の処理 } elsif ($user_agent[0] eq 'L-mode') { # L-mode 用の処理 } else { # それ以外 } 具体的にはどのような記述にしてどこにアップすればよいのでしょうか? 初心者なので御教授戴ければ幸いです

    • ベストアンサー
    • CGI
  • パターンマッチにおける「-」の扱い

    例えば以下のように記載するとエラーとなります。 if($::FORM{'body'} =~ /パターン/){ push(@error, '投稿できません'); } しかし、以下のように記載するときちんとパターンマッチします。 このふたつともエラーが出ておかしくないと思うのですが なぜ以下ならOKなのか教えてください!! @word=qw(パターン); foreach (@word) { if (index($::FORM{'body'},$_) >= 0) { push(@error, '投稿できません。'); } }

    • ベストアンサー
    • Perl
  • 条件一致の方法

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

    • ベストアンサー
    • Perl
  • 携帯端末認識User-Agentについて

    初心者なのですが、CGIで携帯サイトを作っていますが。 実機がうまく動きません。User-Agentに問題があると考えています。 現在のソースと主な現象を記しますので、適切なものを教えて下さい。お願いします。 #----------# # 端末認識 # #----------# sub useragent { my $ua; #次にi-mode端末かどうかチェック if ($ENV{'HTTP_USER_AGENT'} =~ /^DoCoMo\/\d/) { $ua = 1; #次にJ-Phone端末かどうかチェック } elsif ($ENV{'HTTP_USER_AGENT'} =~ /^J-PHONE\/\d/) { $ua = 2; #EZweb端末かどうかチェック } elsif (($ENV{'HTTP_USER_AGENT'} =~ 'UP.B') && ($ENV{'HTTP_X_UP_SUBNO'} ne "")){ $ua = 3; #その他はPCとする } else { $ua = 0;} #PCブラウザ再判定 if ($ENV{'HTTP_USER_AGENT'} =~ /Mozilla\/|MSIE|Netscape|Opera|Lynx|AOL|Gecko/) {$ua = 0;} return $ua; } 主な現象 AU:ページ表示ごとに、いちいちブラウザメニューからページ更新をしなければならない(AUの特性もありますが) ソフトバンク:携帯版ではなく、PC版が表示されてしまう。 ドコモ :Pは問題ないようだが、SHは会員登録画面のフォームが半分の項目しか表示されず、次のページで残りの半分 は表示されるが、フォームにすべて書き込んで、登録送信をクリックしても、エラーデータ、の表示が出る。

    • 締切済み
    • CGI
  • 複数の比較( =~ )を効率よくまとめたい

    アクセス端末によって見え方を変えさせるため、条件節ifで =~ を使って分岐させているのですが、ユーザーエージェントがあまりにも多く、コードが長くなりすぎ制作に支障が出てきています 100%完璧に分岐させるところまでは求めていないため(アクセスの95%程度うまく分けられればいいかと思ってます)、たとえばスマホの場合はiPhoneとかAndroid、PCの場合はMSIEなど極力共通の部分を見つけてまとめてはいますが、それでも携帯、スマホ、PCと分けると非常に多くなり、 if(($ENV{'HTTP_USER_AGENT'} =~ /MSIE/) || ($ENV{'HTTP_USER_AGENT'} =~ /Firefox/)){} など比較の片方は同じなのに同じことを何度も書く必要があり、非効率かつ強烈に長くなってしまい何とかまとめられないかと格闘しています たとえば別で $os_pc = "MSIE,Firefox"; $os_mb = "DoCoMo,KDDI"; など別でまとめて、 if($ENV{'HTTP_USER_AGENT'} =~ /$os_pcの,で分解したそれぞれの文字列と比較/){ PCと判定 }elsif($ENV{'HTTP_USER_AGENT'} =~ /$os_mbの,で分解したそれぞれの文字列と比較/){ 携帯と判定 } といったように、スマートに条件分岐させられないかと模索中ですが、=~ で別で用意したデータを,で分解してそれぞれと比べるとかできないでしょうか。 =~での比較ではなく、他の方法でもかまいませんので、ぜひお知恵をお貸しください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ソフトバンクだけ見られない

    下記のとおりフリーCGIを利用させていただいていいます。 #!/usr/bin/perl ################################################ #中略################################################ ##設定箇所###################################### # パソコンの場合-------------------------------- # PCでIEを使っている場合 $jumpURLpcIE=""; # PCでFirefoxを使っている場合 $jumpURLpcFX=""; # PCでOperaを使っている場合 $jumpURLpcOP=""; # PCでNetscapeを使っている場合 $jumpURLpcNS=""; # 携帯電話の場合-------------------------------- # 携帯電話でKDDIを使っている場合 $jumpURLpnKD=""; # 携帯電話でDoCoMoを使っている場合 $jumpURLpnDO=""; # 携帯電話でボーダフォンを使っている場合 $jumpURLpnJP=""; # それ以外の場合-------------------------------- $jumpURLetC=""; ##ここまで###################################### # 環境変数を所得 $agent= $ENV{'HTTP_USER_AGENT'}; # 受け取ったデータのうち「,」と「%2C(,)」をエスケープ $agent =~ s/,/%2C/g; # PCでIEの場合 if ($agent=~/MSIE/&&$agent=~/.NET/){ print "Location: $jumpURLpcIE\n\n"; } # PCでFXの場合 elsif ($agent=~/Firefox/){ print "Location: $jumpURLpcFX\n\n"; } # PCでOPの場合 elsif ($agent=~/MSIE/&&$agent=~/Opera/){ print "Location: $jumpURLpcOP\n\n"; } # PCでNSの場合 elsif ($agent=~/Netscape/){ print "Location: $jumpURLpcNS\n\n"; } # 携帯電話でKDDIの場合 elsif ($agent=~/KDDI-/||$agent=~/UP\.Browser/){ print "Location: $jumpURLpnKD\n\n"; } # 携帯電話でDoCoMoの場合 elsif ($agent=~/DoCoMo/){ print "Location: $jumpURLpnDO\n\n"; } # 携帯電話でボーダフォンの場合 elsif ($agent=~/J-PHONE/||$agent=~/Vodafone|MOT-/){ print "Location: $jumpURLpnJP\n\n"; } else{ print "Location: $jumpURLetC\n\n"; } exit; しかし、ソフトバンクは携帯から見られません。 教えてください。 訂正していただけると助かります。。 よろしくお願いします。

    • 締切済み
    • CGI
  • .htaccessの記述

    さくらのレンタルサーバを使っています。 SetEnvIf User-Agent "Googlebot" shutout1 SetEnvIf User-Agent "Slurp" shutout2 SetEnvIf User-Agent "msnbot" shutout3 SetEnvIf Referer "google\.co\.jp" shutout4 SetEnvIf Referer "yahoo\.co\.jp" shutout5 SetEnvIf Referer "google\.com" shutout6 order allow,deny allow from all deny from env=shutout1 deny from env=shutout2 deny from env=shutout3 deny from env=shutout4 deny from env=shutout5 deny from env=shutout6 (改行) 新しくつくったページですので検索ロボットにはまだ拾われていないのでGmailで実験しましたが、http://mail.google.com/mail/~ からアクセスできてしまいます。アスキーモードで転送し、ファイル名もOKです。何がダメなのでしょうか… あと、「SetEnvIf Referer "google" shutout*」と記述すれば「google」を含むアドレスからのリンクはまとめてすべて拒否できますか? よろしければチェックをお願いします。

    • ベストアンサー
    • HTML

専門家に質問してみよう