• ベストアンサー

条件分岐について

# 禁止文字 @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/)を書きくわえてみたのですがうまくいきません。 どのようにしたら両方の条件式に一致した場合にエラーを吐き出せるのでしょうか?

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

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