PHPで制御文字以外の文字入力を許可したかったが、
なぜか末尾改行が許可されてしまったので調べてみました。
文字列の末尾にだけマッチさせたい場合には「¥z」を使うということなので「$」と比較してみました。
結果、思い通りの動作になったのでメモ。
まずは「$」の場合
なぜか末尾改行がfilter_varを通ってしまう・・・
$options = ['options' => [
'flags' => FILTER_FLAG_ALLOW_OCTAL,
'regexp' => '/^[[:^cntrl:]]{0,5}$/u',
]];
$var = filter_var("アイ\nウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"アイ\nウ07"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("アイウ07\n", FILTER_VALIDATE_REGEXP, $options);
echo '"アイウ07\n"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("アイ\n", FILTER_VALIDATE_REGEXP, $options);
echo '"アイ\n"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("\nウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"\nウ07"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("\n\nウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"\n\nウ07"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("\n", FILTER_VALIDATE_REGEXP, $options);
echo '"\n"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("アイウ07", FILTER_VALIDATE_REGEXP, $options);
echo '"アイウ07"'."\n";
var_dump($var);
echo "\n";
$var = filter_var("", FILTER_VALIDATE_REGEXP, $options);
echo '""'."\n";
var_dump($var);
echo "\n";
「$」の判定結果(末尾改行がfalseにならない)
"アイ\nウ07"
bool(false)
"アイウ07\n"
string(12) "アイウ07
"
"アイ\n"
string(7) "アイ
"
"\nウ07"
bool(false)
"\n\nウ07"
bool(false)
"\n"
string(1) "
"
"アイウ07"
string(11) "アイウ07"
""
string(0) ""
「$」ではなく「\z」に変更
思い通りfilter_varで判定できました。
$options = ['options' => [
'flags' => FILTER_FLAG_ALLOW_OCTAL,
'regexp' => '/^[[:^cntrl:]]{0,5}\z/u',
]];
以下上と同じ
「\z」の判定結果(末尾改行もfalse)
"アイ\nウ07"
bool(false)
"アイウ07\n"
bool(false)
"アイ\n"
bool(false)
"\nウ07"
bool(false)
"\n\nウ07"
bool(false)
"\n"
bool(false)
"アイウ07"
string(11) "アイウ07"
""
string(0) ""