3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

オチ

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?