CGI-BBS > 基礎 > その他 > 掲示板の改造で半角文字のみの投稿ををブロックしたい。


カレッヂ
カレッヂ


質問者 みそ  投稿日 2006/4/20(木) 13:06:57
最近海外からのスパムな書き込みが多いので
英語のみの書き込み(全角文字の無い書き込み)を
ブロックしたいと考えました。

そこで、「文字列の長さ」と「文字列のバイト数」が
同じ場合エラーとしてやれば良いのでは?と思い
至ったのですが、では実際にどのような記述にすれば
よいのか判りませんでした。

「ここを見れば良いよ」等ヒントでも構いません。
どうかよろしくお願いします。

【習熟度】(未選択)

回答者 rescue  [削除]  投稿日 2006/5/12(金) 11:29:41
カッコ良くコーディングするなら、

http://ash.jp/ash/src/code/
http://washitake.com/cpp/kanji.php
http://euc.jp/i18n/charcode.ja.html

を参考にして、文字コードを判定して処理するプログラムを書くといいと思いますが、
簡単に考えるなら、データを1文字ずつ取り出し(substr)、
0123456789abcdef...xyz-/*+=.,!"#$%&'()0`|{}~+*>?_< まだあるかな?
キーボードで打てるすべての半角文字の中にある文字かどうかを比較し、
1文字でも(または数個以上にあいまいにする)この範囲に無い文字が出てきたら
全角文字が含まれていると判断するとか…


##
#### ■全角混在用substr() # 出典 Perl Tips <akebi.jp> by あけび for Shift_JIS
##

sub z_substr {

	local($s,$p,$l) = @_;
	$s =~ s/(.)/$1\0/g;
	$s =~ s/([\x81-\x9f\xe0-\xfc])\0(.)\0/$1$2\0\0/g;
	$s = $l eq '' ? substr($s,$p*2):substr($s,$p*2,$l*2);
	$s =~ tr/\0//d;
	$s;
}

を併用すると精度もあがるかもしれません。
いろいろロジックを考えるもの面白いものです。

----
サポート掲示板利用ご案内の通り、当方はバグと思われる事象以外には参加しません。
ただ、時間が許す場合に例外的に回答する場合がありますが、継続的にやりとりが
出来ない場合があります。ご理解ください。

質問者 みそ  [削除]  投稿日 2006/5/24(水) 12:13:04
レスポンスをいただきありがとうございます。

前回、具体的なコトを書いていなかったのですが、
簡易BBSのversion 10.31を利用させていただいて
おります。前回の書き込みを行った時点では、
上記の様な対応でなんとかなるかな?と思ってた
のですが、ネットサーフィンをするうちに、
文字列のバイト数はlengthで取得することが
出来そうだが、文字数を取得する術がなさそうだぞ
と思い至り、ネットから拾ってきた下記の様な
コードを追加することにしました。

	if ($FORM{'value'} =~ /^[\x20-\x7E]+$/) {
		if ($FORM{'value'} !~ /^[\xA1-\xFCFF]+$/) { &error('入力ミス','内容に全角文字を含めてください.'); }
	}

しかしこれだと改行が含まれた書き込みを弾くことが
出来なかったので、1行目を
	if ($FORM{'value'} =~ /^[\x20-\x7E\r]+$/m) {
としてみました。

これでなんとか改行を含む半角のみの投稿をはじく
ことができました。ありがとうございます。

返信(回答)する

 


Web裏技