[PHP]正規表現の全体一致は「^~$」だけでは不十分

Pocket

preg_match() などの正規表現で「abcd」に一致するパターンの書き方は「^abcd$」というのが一般的ですが、ラインフィードなどの記号が混じっていた場合すり抜けてしまうケースが有るようです。

[参考サイト]
「正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう」
http://blog.tokumaru.org/2014/03/z.html

<?php
$value = "abcd\n";
echo strlen($value);

if( preg_match('/^abcd$/', $value) ){
	echo 'OK';
} else {
	echo 'NG';
}

if( preg_match('/\Aabcd\z/', $value) ){
	echo 'OK';
} else {
	echo 'NG';
}

上が「^~$」を使った通常のパターンで、下は「\A~\z」を使ったパターンです。
通常のパターンではチェックをすり抜けて「OK」となってしまいますが、改行コードが末尾に付いているため文字数をカウントすると5文字になっています。
これは GET で「index.php?value=abcd%0a」のように受け取る場合でも同様です。


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です