2013年12月16日月曜日

PHP 正規表現で^と$は使用しないほうがいいらしい

PHPの正規表現で^と$を使用すると意図しない動作をするようです
文字列の末尾にLF(UNIX系OS改行コード)が入るとそれを文字列の末尾と解釈し、マッチしてしまいます。
CR(Mac系OS改行コード)とCR+LF(Windows系OS改行コード)は文字として解釈するためマッチしません。
以下、検証と対策

CRとCR+LFにはマッチしない
PHPで簡単な正規表現を書いてみました
index.php
<?php
    $data = isset($_GET['data']) ? $_GET['data']: '';
    if (1 === preg_match('/^hoge$/u', $data)) {
        echo '入力成功';
    } else {
        echo '入力失敗';
    }
CR
http://localhost/index.php?data=hoge%0D
CR+LF
http://localhost/index.php?data=hoge%0D%0A

両方共、入力失敗と出力されます

LFにマッチしてしまう
http://localhost/index.php?data=hoge%0A
入力成功と出力されてしまいます

対策
^と$の代わりに\Aと\zを使用します
index.php
<?php
    $data = isset($_GET['data']) ? $_GET['data']: '';
    if (1 === preg_match('/\Ahoge\z/u', $data)) {
        echo '入力成功';
    } else {
        echo '入力失敗';
    }

http://localhost/index.php?data=hoge%0A
無事、入力失敗と出力されます

0 件のコメント :

コメントを投稿