preg_match関数と正規表現の理解を再度見直す

More than 1 year has passed since last update.

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とする。


特定の文字だけならtrue

  //半角アルファベットと数字、ハイフン、アンダースコア「以外」を対象とする

$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なら、判定処理自体に失敗したので、例外処理に分岐

みたいなロジックをとる。


オチ


・・・といったことが、すぐに頭に浮かび、エンジニア以外に説明でき、そつなくコードをかけるように ワタシハナリタイ