正規表現で $ は終端ではなく行末を意味します。
たとえば次のような正規表現があります。
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(徳丸浩)の日記