岩手からこんにちは ☆彡 perl とかウェブ系なブログ

はてなダイアリーからひっこしましたよ http://d.hatena.ne.jp/rosiro

ウェブアプリケーション的一般的な文字列チェック

http://d.hatena.ne.jp/ockeghem/20090307/p1

# 制御文字(\x00〜\x1f, \x7f)のチェック
# 文字列長のチェック
結局ウェブで本文らしきものを入力する箇所では上記を入力時にチェックすればいいのかな?と思ったけど。(別途出力時やSQL等のエスケープする必要があると思う)

http://blog.livedoor.jp/dankogai/archives/51186108.html
dankogaiさんのところのソース+nihenさんコメントとか考えると答えは

#!perl -l
use strict;
use warnings;
use utf8;
sub check {
    $_[0] !~ /\A[\P{Cc}\r\n]{1,2048}\z/;
}
print 0+check("妥当な 文字列");
print 0+check("妥当な 文字列"); # fullwidth space
print 0+check("妥当な\t文字列");
print 0+check("妥当な 文字列\n");
print 0+check("\x{00}\x{01}\x{02}\x{03}");

http://codepad.org/I3q8CXx2

こんなんでいいんだろうか。
正規表現の深さ?は32766まで65535指定して怒られたよ

追記 上記の正規表現では32766までしか文字列の長さを調べることができなかったので(perlのバージョンとかOSによってちがうのかも)ので長さチェックは省いて /\A[\P{Cc}\r\n]+?\z/;みたいにして。 文字列長については別途lengthで調べることにしました。
ockeghem さんに教えていただいたページの表1を参考にするのが良さそうです。
http://itpro.nikkeibp.co.jp/article/COLUMN/20090525/330611/?ST=security&P=2