スポンサーリンク

CodeIgniterのregex_matchによる検証では正規表現にパイプを使用出来ない

Web系

CodeIgniterでフォームバリデーション(フォーム入力された値の検証)のルールに正規表現を使用する場合はregex_matchを使用しますが、正規表現で「または」を示す”|”を記述することは出来ません。

例えば、各2桁で示される秒までの24時間表記の時間 date(Y:i:s) であるかをチェックしたい場合を例にします。

([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]

この正規表現をCodeIgniterのルールとして記述すると下記のようになります。

$this->form_validation->set_rules('name','Name','trim|xss_clean|regex_match[\^([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$\]');

しかし、set_rules()内での”|”がルールの区切りとして扱われることにより正規表現が正しく解釈されず、”preg_match(): No ending delimiter ‘/’ found”というエラーが発生していまいます。
※regex_matchは内部的にpreg_match()を呼び出しています

これを解決するにはコールバック関数を定義する必要があります。

$this->form_validation->set_rules('name','Name','trim|xss_clean|callback_time_check');
public function callback_time_check($str)
{
  if (preg_match('\^([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$\', $str))
  {
    return TRUE;
  }
  else
  {
    $this->form_validation->set_message('time_check', '時間は00:00:00から23:59:59までを指定して下さい');
    return FALSE;
  }
}