Zend_Filterによるデータのフィルタ処理

前回は、『Zend_Validate』で、バリデーション処理について調べてみましたが、今日は、『Zend_Filter』でデータのフィルタ処理について調べてみたいと思います。

『Zend_Validate』は、入力されたデータが条件に合うかどうかを判定するだけですが、『Zend_Filter』は、入力されたデータから必要なもののみを取り出す『透過型』と入力されたデータ内の特定の文字を変換する『変換型』があります。

Zend_Filterには、標準のフィルタがあらかじめいくつか用意されています。下記にそのコンポーネントの一覧を表示します。

  • Zend_Filter_Alnum(透過型)
    文字列から英数字のみを取り出す(空白も指定可)
  • Zend_Filter_Alpha(透過型)
    文字列から英字のみを取り出す(空白も指定可)
  • Zend_Filter_Digits(透過型)
    文字列から数字のみを取り出す
  • Zend_Filter_Dir(透過型)
    ファイルパスからディレクトリ名のみを取り出す
  • Zend_Filter_BaseName(透過型)
    ファイルパスからファイル名のみを取り出す
  • Zend_Filter_RealPath(変換型)
    文字列中の相対パスを絶対パスに変換する
  • Zend_Filter_Int(変換型)
    数字文字列を整数に変換する
  • Zend_Filter_StringToLower(変換型)
    文字列中の英字を小文字に変換する
  • Zend_Filter_StringToUpper(変換型)
    文字列中の英字を大文字に変換する
  • Zend_Filter_StringTrim(変換型)
    文字列の先頭と末尾のホワイトスペースを取り除く
  • Zend_Filter_HtmlEntities(変換型)
    文字列中のHTML特殊文字をエンティティ変換する
  • Zend_Filter_StripTags(変換型)
    文字列からHTMLとPHPのタグを取り除く
  • Zend_Filter_PregReplace(変換型)
    正規表現にマッチしたものを指定文字列に変換する

※UTF-8で記述されていれば、マルチバイト文字も処理が可能です。たとえば『英数字』は『半角」でも『全角』でも問題なく処理してくれます。

 Zend_Filterの使い方

Zend_Filterの使い方は、ほとんどZend_Validateと同じですので、Zend_Validateの使い方を覚えておけば、Zend_Filterは簡単に使うことが出来ます。

 静的メソッドを『get()』を使用する方法

Zene_Validateと同様、静的メソッドを使用する方法と通常のインスタンスを生成する方法があります。まず、静的メソッドを仕様する方法から調べてみたいと思います。

静的メソッドを使用する場合は、Filterコンポーネントをロードして、フィルタ処理を走らせるだけです。この方法では、『get()』メソッドに必要な情報を全て渡し、一度に処理を完結できます。

Zend_Filter::get(‘データ,フィルタ名[,フィルタに渡すパラメータ])

※フィルタにパラメータを渡す場合は、1つであっても必ず配列にしなければなりません。

それでは、実際に作成してみます。文字列の先頭と末尾にホワイトスペースを取り除く、『StringTrim』を使用します。

1) TestController.phpの冒頭にFilterコンポーネントをロードします。

require_once ‘Zend/Filter.php’;

2) addActionメソッドを修正します。

public function addAction()
 {
 //POST送信されたら
 if($this->getRequest()->isPost()){
 $title=$this->getRequest()->getParam('title');
 $content=$this->getRequest()->getParam('content');
 $error='';
 //フィルタ処理(ホワイトスペースの除去)
 $title=Zend_Filter::get($title,'StringTrim');
 $content=Zend_Filter::get($content,'StringTrim');
 //静的メソッドのバリデーション処理
 if(!Zend_Validate::is($title,'NotEmpty')){
 $error.="タイトル名は必須です。<br>";
 }
 if(!Zend_Validate::is($content,'NotEmpty')){
 $error.="コンテンツを入力して下さい。<br>";
 }
 //チェックOK時の処理
 if($error == ''){
 $data = array(
 'title' => $title,
 'content' => $content
 );
 //データベースにレコードを挿入
 $this->db->insert('dvd_collections',$data);
 //indexにリダイレクトします
 $this->_redirect('test/index');
 }
 //バリデーションエラー時の処理
 $this->view->assign('error',$error);
 }
 }

3) ブラウザで確認してみます。Titleには先頭に半角スペースを4文字分挿入してから文字を入力して、Contentには、全角スペースを1文字分挿入してから送信してみました。

4) どうやら、StringTrimでは、全角スペースは削除しないようです。全角スペースも削除するためのコンポーネントもあるのでしょうか。無ければ、自分で作る必要があるのでしょうか。とりあえず今のところは不明ですが、先に進みます。

インスタンスを生成する通常の使用方法

インスタンスを生成する使用方法では、使用するだけのフィルタのコンポーネントを先にロードしておきます。そして、インスタンスを生成して、フィルタ処理を走らせます。

フィルタ処理は各コンポーネント共通の仕様になっており、『filter()』メソッドをコールするだけです。インスタンスを生成するこの方法は、Zend_Filterの全ての機能を利用することが出来ますので、特別な理由がない限りこちらを選んだ方がいいみたいです。

1) 利用する各コンポーネントを全て冒頭でロードします。今回は、『StringTrim』しか使用しませんので、TestController.phpの先頭にStringTrimをロードします。

require_once ‘Zend/Filter/StringTrim.php’;

2) addActionを下記のように修正します。

public function addAction()
 {
 //POST送信されたら
 if($this->getRequest()->isPost()){
 $title=$this->getRequest()->getParam('title');
 $content=$this->getRequest()->getParam('content');
 $error='';
 //フィルタインスタンスの生成
 $filter=new Zend_Filter_StringTrim();
 $title=$filter->filter($title);
 $content=$filter->filter($content);
 //静的メソッドのバリデーション処理
 if(!Zend_Validate::is($title,'NotEmpty')){
 $error.="タイトル名は必須です。<br>";
 }
 if(!Zend_Validate::is($content,'NotEmpty')){
 $error.="コンテンツを入力して下さい。<br>";
 }
 //チェックOK時の処理
 if($error == ''){
 $data = array(
 'title' => $title,
 'content' => $content
 );
 //データベースにレコードを挿入
 $this->db->insert('dvd_collections',$data);
 //indexにリダイレクトします
 $this->_redirect('test/index');
 }
 //バリデーションエラー時の処理
 $this->view->assign('error',$error);
 }
 }

3) 今回もブラウザで確認してみます。

4) 半角スペースは削除されました。

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ