PHPメモ:英字スパム対策(再修正)


以前にPHPでの英字スパム対策を書きましたが…
結局その方法ではすり抜けられたので、再度修正です。



//(修正前)
if(ereg("[^ -~]",$text)){
//処理
}


上記では2バイト文字を含まない場合に拒否するようにしていましたが…
どうも、わざと2バイト文字を数文字を含めてくる英字スパムがあったので…orz



今回は「ひらがな」を含む場合のみ処理するようにしました。
まぁ結局数行の処理なんですけどね…



//(修正後)
//$textにひらがな(あ〜ん)が含まれる時だけ処理を行う
if(mb_ereg("[あ-ん]",$text)){
//処理
}


上記は正規表現で「あ〜ん」が含まれている場合に処理をするというものです。



前は無理に1バイト文字をチェックしていましたが…
結局、英字スパムにはこれが一番効果がありそうです…(汗)




コメント
"[あ-ん]"だと"aあ"にマッチしない。
".*[あ-ん]"が良いかと。
  • 2009/10/27 9:19 AM
>"[あ-ん]"だと"aあ"にマッチしない。

確かにそうですね。失念していました!
ご指摘ありがとうございます。
後々記事も書き直させて頂きます!
  • 謎猫
  • 2009/10/28 12:43 AM
mb_ereg_match に代えて mb_ereg ではダメですか?
正規表現は"[あ-ん]"のままでいけますし。
ご指摘ありがとうございます。
確かに「mb_ereg」の方が良さそうですね。

関数の名前からして「mb_ereg_match」の方がよさそう
という理由だけでこっちを使っていました。
「mb_ereg_match」だと1文字目から比較して、
「mb_ereg」だと1文字目【以降】から比較する違いがあるんですね。

書き換えておきました。
お返事感謝です。
半角英数字のみの文字列を弾く方法を探していてこちらの
サイトを拝見させて頂いた経緯だったのですが、お蔭様で
首尾よく弾く事が出来ました。重ねて感謝です。

> 「mb_ereg_match」だと1文字目から比較して、
> 「mb_ereg」だと1文字目【以降】から比較する違いがあるんですね。
うわ、そうだったんですか。
当方、stristr() や strrpos() 等と同じ動作かと思ってました。^^;
文字列の最初の文字が平仮名でない場合、以降に平仮名が存在しても
平仮名が存在しない判定になってしまったので、似た関数を
PHP マニュアルから見つけてそれを単に mb_ereg_match() と替えてみた
ら上手く行っただけなんです。お恥ずかしい限りです。
よい勉強をさせていただけました事にも感謝申し上げます。m(__)m
コメントする








    
この記事のトラックバックURL
トラックバック