正規表現 行末の $ と終端

正規表現で $ は終端ではなく行末を意味します。

たとえば次のような正規表現があります。

if (preg_match('/^abcdef$/', $value) ....

この場合、"abcdef" だけでなく "abcdef + 改行" もマッチしてしまいます。

ですので、次のような処理を書いて英小文字だけを期待しても

$input = $_GET['data'];
if (preg_match('/^[a-z]+$/', $input) ....

xxxxx.php?data=abcde とかだけでなく
xxxxx.php?data=abcde%0A もマッチしてしまうわけです。 (%0A は改行)

このようなときは次のように書くそうです。

$input = $_GET['data'];
if (preg_match('/\\A[a-z]+\\z/', $input) ....

[参考]
もし『よくわかるPHPの教科書』の著者が徳丸浩の『安全なWebアプリケーションの作り方』を読んだら - ockeghem(徳丸浩)の日記

Google サイト内検索

Amazonアソシエイト