正規表現のメタ文字とエスケープシーケンスについておさらい。
- メタ文字
^
: (ハット記号) 検索対象(複数行モードでは行)の始まりを言明 - メタ文字
$
: (ドル記号) 検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明 - エスケープシーケンス
\A
: 検索対象文字列の始端(複数行モードとは独立) - エスケープシーケンス
\z
: 検索対象文字列の終端(複数行モードとは独立)
言明 \A, \Z, \z は、(アンカー で説明する)ハット記号やドル記号とは 異なり、オプション設定によらず、文字列の始端または終端だけに マッチします。これらの言明は、PCRE_MULTILINE および PCRE_DOLLAR_ENDONLY オプションの影響を受けません。 \Z と \z との違いは、 \Z は文字列の末尾の改行の前の位置および文字列の 終端にマッチするのに対し、\z は文字列の終端にのみ マッチすることです。
つまり、文字列全体の始端と終端の意図で^
や$
を使っているなら、\A
と\z
のほうが厳密だよ、とういこと。
assert(preg_match('/^hello$/', 'hello') === 1);
assert(preg_match('/^hello$/', "hello\n") === 1); // 末尾に改行(LF)がある文字列が通る(意図と違う動き)
assert(preg_match('/\Ahello\z/', "hello") === 1);
assert(preg_match('/\Ahello\z/', "hello\n") === 0); // 末尾に改行があると通らない(意図通り)