$は最後に改行があってもマッチする。(ただし、マッチした結果には改行は含まれない。)
preg_match('/^aaa$/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
"aaa"
$の代わりに"\z"(バックスラッシュ+小文字のz)にすれば、改行があるとマッチしない。
preg_match('/^aaa\z/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
""
Zが大文字だと$と同様に改行があってもマッチするので注意。
preg_match('/^aaa\Z/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
"aaa"
$は改行の後ろに何かあればマッチしない。
preg_match('/^aaa$/', "aaa\n ", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
""
例えそれが改行でも。
preg_match('/^aaa$/', "aaa\n\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
""
マッチした結果に改行まで含ませるとこうなる。
preg_match('/^aaa\n\z/', "aaa\n", $match);
echo '<pre>"', $match[0], '"</pre>';
↓
"aaa
"
参考
- レスペス・トランクィル: [php][正規表現] 行末には $ ではなく \z を使おう
- もし『よくわかるPHPの教科書』の著者が徳丸浩の『安全なWebアプリケーションの作り方』を読んだら - ockeghem(徳丸浩)の日記