PHPで、受け取った文字列が所定の条件を満たしているか
よく使うけど、とっさに出ないのがこれ。
環境
- PHP (4以上:preg_matchが使える環境)
ereg は5.3以降で非推奨になり、7.0.0で削除とのこと
http://php.net/manual/ja/function.ereg.php
だからpreg_matchを使うことにしました
http://php.net/manual/ja/function.preg-match.php
preg_match関数の仕様(抜粋)
php.netのドキュメントより抜粋
関数の文法が記載されていますが
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
ここで扱うのは手前2つの引数 $pattern
=パターン $subject
= 判定対象 です。
戻り値は、pattenが指定したsubject内にマッチした時に1 しなかった時に 0 エラーが発生した時にfalse なので注意
利用ケース
IDなど、指定した文字しか許可しない場合
IDやパスワードなどにありがちな、
半角アルファベットと数字、ハイフン、アンダースコアのみ許可するパターン。
この場合、判定対象の文字列に、許可する文字「以外」が存在したらNG(=false)とみなす。存在しなければOK(=true)とみなす。とする。
厳密には例外処理すべきだが、エラーが発生した場合もNGとする。
//半角アルファベットと数字、ハイフン、アンダースコア「以外」を対象とする
$id_ptn = '/[^A-Za-z0-9\-_]/';
$ok_id = "user_1-2";
$ng_id = "user#1-2";
//$ok_id_ptnの場合、指定した文字以外が無いのでpreg_match が0を返しtrue
$ok_id_ptn = preg_match($id_ptn,$ok_id) === 0 ? true : false;
//$ng_id_ptnの場合、指定した文字以外が存在するので1を返し false
$ng_id_ptn = preg_match($id_ptn,$ng_id) === 0 ? true : false;
上記のパターンで、エラーも分けるならpreg_match
の戻り値をそのまま判定し、
- 0なら許可する文字だけが存在しているので、正しい時の処理に分岐
- 1なら許可する文字以外が存在しているので、不正な時の処理に分岐
- falseなら、判定処理自体に失敗したので、例外処理に分岐
みたいなロジックをとる。