Programmer's Reference Guide

導入

標準のフィルタクラス群

Zend Framework には、すぐに使える標準のフィルタ群が同梱されています。

Alnum

文字列 $value から、アルファベットおよび数字以外を取り除いたものを返します。 このフィルタでは、オプションとして空白文字を認めることもできます。

注意: アルファベットとは各言語で単語を構成する文字を意味します。 ただし、以下の言語では英語のアルファベットをアルファベットとして扱います:中国語、日本語、韓国語。 言語はZend_Localeで指定されます。

Alpha

文字列 $value から、アルファベット以外を取り除いたものを返します。 このフィルタでは、オプションとして空白文字を認めることもできます。

BaseName

ファイルへのパスを含む文字列を受け取り、 ファイルのベース名の部分のみを返します。

Callback

このフィルタにより、Zend_Filterとともに自分自身のメソッドを使うことができます。 機能を果たすメソッドすでにあるとき、新しいフィルタを生成する必要はありません。

文字列を逆にするフィルタを生成したいとしましょう。

  1. $filter = new Zend_Filter_Callback('strrev');
  2.  
  3. print $filter->filter('Hello!');
  4. // "!olleH"を返します

おわかりのように、自分自身のフィルタを定義するために本当に簡単にコールバックを使えます。 メソッド(それはクラス内で定義されます)をコールバックとして配列を与えることによって使うことも可能です。

  1. // クラスの定義
  2. class MyClass
  3. {
  4.     public function Reverse($param);
  5. }
  6.  
  7. // フィルター定義
  8. $filter = new Zend_Filter_Callback(array('MyClass', 'Reverse'));
  9. print $filter->filter('Hello!');

実際に設定されているコールバックを取得するには getCallback()を使い、 他のコールバックを設定するには setCallback()を使います。

フィルタが実行されるとき、 呼ばれるメソッドに配列として与えられるデフォルト・パラメータを定義できます。 この配列は、フィルターされた値で結合されます。

  1. $filter = new Zend_Filter_Callback(
  2.     array(
  3.         'callback' => 'MyMethod',
  4.         'options'  => array('key' => 'param1', 'key2' => 'param2')
  5.     )
  6. );
  7. $filter->filter(array('value' => 'Hello'));

手動で上記のメソッド定義を呼ぶと、それはこのように見えます:

  1. $value = MyMethod('Hello', 'param1', 'param2');

注意: 呼ばれることができないコールバック・メソッドを定義すると、 例外が発生する点に注意しなければなりません。

Decrypt

このフィルタは、指定した文字列を指定した設定で復号します。 復号の際に、アダプタを使用します。実際には、PHP の Mcrypt および OpenSSL 拡張モジュール用のアダプタを使用します。

コンテンツの暗号化方法の詳細については Encrypt フィルタを参照ください。 基本的な内容は Encrypt フィルタで網羅されているので、 ここでは追加のメソッドや復号時に固有のことなどについてのみ説明します。

Mcrypt の復号

Mcrypt で暗号化したコンテンツを復号するには、 暗号化を行った際に指定したオプションが必要です。

ここでひとつ暗号化時との大きな違いがあります。 暗号化の際にベクトルを指定しなかった場合は、コンテンツを暗号化した後で フィルタの getVector() メソッドを使用してベクトルを取得する必要があります。 正しいベクトルがなければ、コンテンツを復号することはできません。

オプションを指定しさえすれば、復号は暗号化と同じくらい単純なことです。

  1. // デフォルト設定の blowfish を使用します
  2. $filter = new Zend_Filter_Decrypt('myencryptionkey');
  3.  
  4. // コンテンツの暗号化用ベクトルを設定します
  5. $filter->setVector('myvector');
  6.  
  7. $decrypted = $filter->filter('encoded_text_normally_unreadable');
  8. print $decrypted;

注意: mcrypt 拡張モジュールが使用できない場合は例外が発生することに注意しましょう。

注意: また、インスタンス作成時あるいは setEncryption() をコールした際にすべての設定がチェックされることにも注意しましょう。 設定内容に問題があることを mcrypt が検知すると、例外がスローされます。

OpenSSL の復号

OpenSSL での復号は、暗号化と同様にシンプルです。 しかし、コンテンツを暗号化した人からすべてのデータを受け取る必要があります。

OpenSSL の復号には、以下が必要となります。

  • private: コンテンツの復号に使用する秘密鍵。 鍵ファイルのパスとファイル名を指定するか、 あるいは単に鍵ファイルの内容そのものを指定することもできます。

  • envelope: コンテンツを暗号化した人から受け取った、 暗号化されたエンベロープ鍵。 鍵ファイルのパスとファイル名を指定するか、 あるいは単に鍵ファイルの内容そのものを指定することもできます。

  1. // openssl を使用し、秘密鍵を指定します
  2. $filter = new Zend_Filter_Decrypt(array(
  3.     'adapter' => 'openssl',
  4.     'private' => '/path/to/mykey/private.pem'
  5. ));
  6.  
  7. // もちろん、初期化時にエンベロープ鍵を指定することもできます
  8. $filter->setEnvelopeKey(array(
  9.     '/key/from/encoder/first.pem',
  10.     '/key/from/encoder/second.pem'
  11. ));

注意: OpenSSL アダプタは、正しい鍵を渡さないと動作しないことに注意しましょう。

オプションで、パスフレーズを渡さなければ鍵を復号できないようにすることもできます。 そのために使用するのが setPassphrase() メソッドです。

  1. // openssl を使用し、秘密鍵を指定します
  2. $filter = new Zend_Filter_Decrypt(array(
  3.     'adapter' => 'openssl',
  4.     'private' => '/path/to/mykey/private.pem'
  5. ));
  6.  
  7. // もちろん、初期化時にエンベロープ鍵を指定することもできます
  8. $filter->setEnvelopeKey(array(
  9.     '/key/from/encoder/first.pem',
  10.     '/key/from/encoder/second.pem'
  11. ));
  12. $filter->setPassphrase('mypassphrase');

最後に、コンテンツを復号します。 暗号化したコンテンツの復号を行う完全な例は、このようになります。

  1. // openssl を使用し、秘密鍵を指定します
  2. $filter = new Zend_Filter_Decrypt(array(
  3.     'adapter' => 'openssl',
  4.     'private' => '/path/to/mykey/private.pem'
  5. ));
  6.  
  7. // もちろん、初期化時にエンベロープ鍵を指定することもできます
  8. $filter->setEnvelopeKey(array(
  9.     '/key/from/encoder/first.pem',
  10.     '/key/from/encoder/second.pem'
  11. ));
  12. $filter->setPassphrase('mypassphrase');
  13.  
  14. $decrypted = $filter->filter('encoded_text_normally_unreadable');
  15. print $decrypted;

Digits

文字列 $value から、数字以外を取り除いたものを返します。

Dir

パス文字列からディレクトリ名を返します。

Encrypt

このフィルタは、指定した設定で任意の文字列を暗号化します。 暗号化の際に、アダプタを使用します。実際には、PHP の Mcrypt および OpenSSL 拡張モジュール用のアダプタを使用します。

これら 2 つの暗号化手法はまったく異なる方式なので、 アダプタの使用法もそれぞれ異なります。 フィルタを初期化する際に、どのアダプタを使うかを選ばなければなりません。

  1. // Mcrypt アダプタを使用します
  2. $filter1 = new Zend_Filter_Encrypt(array('adapter' => 'mcrypt'));
  3.  
  4. // OpenSSL アダプタを使用します
  5. $filter2 = new Zend_Filter_Encrypt(array('adapter' => 'openssl'));

別のアダプタを設定するために setAdapter() を使用することもできます。また getAdapter() メソッドで、実際に設定されているアダプタを取得することができます。

  1. // Mcrypt アダプタを使用します
  2. $filter = new Zend_Filter_Encrypt();
  3. $filter->setAdapter('openssl');

注意: adapter オプションを指定しなかったり setAdapter を使用しなかったりした場合は、デフォルトで Mcrypt アダプタを使用します。

Mcrypt での暗号化

Mcrypt 拡張モジュールをインストールすると、 Mcrypt アダプタが使えるようになります。 このアダプタは、初期化時のオプションとして以下をサポートしています。

  • key: 暗号化用の鍵。 入力を暗号化する際に使用します。 復号する際にも同じ鍵が必要です。

  • algorithm: 使用するアルゴリズム。 » PHP マニュアルの mcrypt のページ であげられている暗号化アルゴリズムのいずれかでなければなりません。 省略した場合のデフォルトは blowfish です。

  • algorithm_directory: アルゴリズムが存在するディレクトリ。 省略した場合のデフォルトは、mcrypt 拡張モジュールで設定されているパスです。

  • mode: 使用する暗号化モード。 » PHP マニュアルの mcrypt のページ であげられているモードのいずれかでなければなりません。 省略した場合のデフォルトは cbc です。

  • mode_directory: モードが存在するディレクトリ。 省略した場合のデフォルトは、mcrypt 拡張モジュールで設定されているパスです。

  • vector: 使用する初期化ベクトル。 省略した場合はランダムなベクトルとなります。

  • salt: キーを salt 値として使用するかどうか。 使用すると、暗号化に使用するキー自体も暗号化されます。 デフォルトは false です。

配列ではなく文字列を指定した場合は、その文字列を鍵として使用します。

初期化した後で暗号化の値を取得したり設定したりするには、それぞれ getEncryption() および setEncryption() メソッドを使用します。

注意: mcrypt 拡張モジュールが使用できない場合は例外が発生することに注意しましょう。

注意: また、インスタンス作成時あるいは setEncryption() をコールした際にすべての設定がチェックされることにも注意しましょう。 設定内容に問題があることを mcrypt が検知すると、例外がスローされます。

暗号化ベクトルの取得や設定には、それぞれ getVector() および setVector() を使用可能です。指定した文字列が、 そのアルゴリズムに必要なベクトルのサイズに応じて切り詰められたり伸ばされたりします。

注意: 自前のベクトル以外を使用する場合は、 そのベクトルを取得してどこかに保存しておかなければならないことに注意しましょう。 そうしないと、文字列が復号できなくなります。

  1. // デフォルト設定の blowfish を使用します
  2. $filter = new Zend_Filter_Encrypt('myencryptionkey');
  3.  
  4. // 自前のベクトルを設定します。それ以外の場合は getVector()
  5. // をコールしてベクトルを保存しておかないと、後で復号できなくなります
  6. $filter->setVector('myvector');
  7. // $filter->getVector();
  8.  
  9. $encrypted = $filter->filter('text_to_be_encoded');
  10. print $encrypted;
  11.  
  12. // 復号の方法は Decrypt フィルタを参照ください

OpenSSL での暗号化

OpenSSL 拡張モジュールをインストールすると、 OpenSSL アダプタが使えるようになります。 このアダプタは、初期化時のオプションとして以下をサポートしています。

  • public: 暗号化したコンテンツを渡したい相手の公開鍵。 複数の公開鍵を指定するには、配列を使用します。 鍵ファイルのパスとファイル名を指定するか、 あるいは単に鍵ファイルの内容そのものを指定することもできます。

  • private: コンテンツの暗号化に使用する、あなたの秘密鍵。 鍵ファイルのパスとファイル名を指定するか、 あるいは単に鍵ファイルの内容そのものを指定することもできます。

後から公開鍵を取得あるいは設定するには、getPublicKey() および setPublicKey() メソッドを使用します。 秘密鍵についても、getPrivateKey() および setPrivateKey() メソッドで取得あるいは設定することができます。

  1. // openssl を使用し、秘密鍵を指定します
  2. $filter = new Zend_Filter_Encrypt(array(
  3.     'adapter' => 'openssl',
  4.     'private' => '/path/to/mykey/private.pem'
  5. ));
  6.  
  7. // もちろん、初期化時に公開鍵を指定することもできます
  8. $filter->setPublicKey(array(
  9.     '/public/key/path/first.pem',
  10.     '/public/key/path/second.pem'
  11. ));

注意: OpenSSL アダプタは、正しい鍵を渡さないと動作しないことに注意しましょう。

鍵自体も暗号化したい場合は、パスフレーズを setPassphrase() メソッドで渡します。 パスフレーズつきで暗号化したコンテンツを復号したい場合は、 公開鍵だけではなく (暗号化された鍵を復号するための) パスフレーズも必要となります。

  1. // openssl を使用し、秘密鍵を指定します
  2. $filter = new Zend_Filter_Encrypt(array(
  3.     'adapter' => 'openssl',
  4.     'private' => '/path/to/mykey/private.pem'
  5. ));
  6.  
  7. // もちろん、初期化時に公開鍵を指定することもできます
  8. $filter->setPublicKey(array(
  9.     '/public/key/path/first.pem',
  10.     '/public/key/path/second.pem'
  11. ));
  12. $filter->setPassphrase('mypassphrase');

最後に、OpenSSL を使用した場合に受け手に渡す必要があるものをまとめます。 暗号化されたコンテンツ、パスフレーズを使用した場合はそのパスフレーズ、 そして復号用のエンベロープ鍵。これらが必要となります。

つまり、暗号化を終えたらエンベロープ鍵を取得する必要があるということです。 取得するには getEnvelopeKey() メソッドを使用します。

OpenSSL でコンテンツの暗号化を行う完全な例は、このようになります。

  1. // openssl を使用し、秘密鍵を指定します
  2. $filter = new Zend_Filter_Encrypt(array(
  3.     'adapter' => 'openssl',
  4.     'private' => '/path/to/mykey/private.pem'
  5. ));
  6.  
  7. // もちろん、初期化時に公開鍵を指定することもできます
  8. $filter->setPublicKey(array(
  9.     '/public/key/path/first.pem',
  10.     '/public/key/path/second.pem'
  11. ));
  12. $filter->setPassphrase('mypassphrase');
  13.  
  14. $encrypted = $filter->filter('text_to_be_encoded');
  15. $envelope  = $filter->getEnvelopeKey();
  16. print $encrypted;
  17.  
  18. // 復号の方法は Decrypt フィルタを参照ください

HtmlEntities

文字列 $value について、 HTML エンティティが存在するものについてはそのエンティティに変換したものを返します。

Int

(int) $value を返します。

LocalizedToNormalized

このフィルタは与えられたローカライズされた入力をその正規化された表現に変換します。 バックグラウンドZend_Localeでこの変換を行うために使います。

このおかげで、ユーザーがユーザー固有の言語表記で情報を入力でき、 さらに例えば正規化された値をデータベースに保存できるようになります。

注意: 正規化と翻訳とは同一ではないことに注意してください。 このフィルタでは、月や日の名前で期待するような、 ある言語から別のものへの文字列の翻訳は行えません。

下記の入力型が正規化されます。

  • integer: ローカライズされた整数値。英語表記に正規化されます。

  • float: ローカライズされたフロート値。英語表記に正規化されます。

  • numbers: 実数のようなその他の数値。英語表記に正規化されます。

  • time: 時刻値。連想配列に正規化されます。

  • date: 日付値。連想配列に正規化されます。

その他の入力はいずれも変更無しにそのまま返されます。

注意: 正規化された出力が常に文字列として与えられることに注意するべきです。 これ以外の場合には、 環境は正規化された出力から、 環境で設定されたロケールで使われる表記法に 自動的に変換します。

数値の正規化

整数、フロートまたは実数のようなあらゆる数が正規化されます。 指数表記の数値は、実はこのフィルタで扱えないので注意してください。

数値についての詳しい正規化方法

  1. //フィルタ初期化
  2. $filter = new Zend_Filter_LocalizedToNormalized();
  3. $filter->filter('123.456,78');
  4. //値 '123456.78' を返します。

アプリケーション全体のロケールとしてロケール 'de' を設定したつもりになりましょう。 Zend_Filter_LocalizedToNormalizedは設定されたロケールを受け取って、 どの種類の入力をあなたが与えたか検出するために、それを使います。 われわれの例ではそれは精度を持つ値でした。 そこで、この値を文字列として正規化した表現をフィルタは返します。

正規化した数がどのようになるべきか、コントロールすることもできます。 このためにZend_Locale_Formatでも使用されるオプションを 全て与えられます。 最も一般的なのは下記です。

  • date_format

  • locale

  • precision

それらのオプションの利用法について詳しくは、 Zend_Locale をご覧下さい。

下記はオプションの動作方法が分かるように精度を定義した例です。

  1. //数値フィルタ
  2. $filter = new Zend_Filter_LocalizedToNormalized(array('precision' => 2));
  3.  
  4. $filter->filter('123.456');
  5. //値 '123456.00' を返します。
  6.  
  7. $filter->filter('123.456,78901');
  8. //値 '123456.79' を返します。

日時の正規化

日付や時刻の値の入力もまた、正規化できます。 与えられた日付および時刻は全て、独自のキーの範囲内で日付の各部分が与えられた 配列として返されます。

  1. //フィルタ初期化
  2. $filter = new Zend_Filter_LocalizedToNormalized();
  3. $filter->filter('12.April.2009');
  4. // array('day' => '12', 'month' => '04', 'year' => '2009') を返します。

ふたたびロケール 'de' を設定したつもりになりましょう。 そこで、入力は自動的に日付として検出され、 返り値に連想配列を受け取ります。

もちろん、日付の入力値をどのようにするか date_formatlocaleオプションで コントロールすることもできます。

  1. //日付フィルタ
  2. $filter = new Zend_Filter_LocalizedToNormalized(
  3.     array('date_format' => 'ss:mm:HH')
  4. );
  5.  
  6. $filter->filter('11:22:33');
  7. // array('hour' => '33', 'minute' => '22', 'second' => '11') を返します。

NormalizedToLocalized

このフィルタはフィルタZend_Filter_LocalizedToNormalizedの逆で、 与えられた正規化された入力をそのローカライズされた表現に変換します。 バックグラウンドZend_Localeでこの変換を行うために使います。

このおかげで、保管された正規化された値をローカルな流儀でユーザーに与えられるようになります。

注意: ローカライズと翻訳とは同一ではないことに注意してください。 このフィルタでは、月や日の名前で期待するような、 ある言語から別のものへの文字列の翻訳は行えません。

下記の入力型がローカライズされます。

  • integer:正規化された整数値。設定した表記方法にローカライズされます。

  • float: 正規化されたフロート値。設定した表記方法にローカライズされます。

  • numbers: 実数のようなその他の数値。設定した表記方法にローカライズされます。

  • time: 時刻値。文字列にローカライズされます。

  • date: 日付値。文字列に正規化されます。

その他の入力はいずれも変更無しにそのまま返されます。

数値のローカライズ

整数、フロートまたは実数のようなあらゆる数がローカライズされます。 指数表記の数値は、実はこのフィルタで扱えないので注意してください。

数値についての詳しいローカライズ方法

  1. //フィルタを初期化
  2. $filter = new Zend_Filter_NormalizedToLocalized();
  3. $filter->filter(123456.78);
  4. //値 '123.456,78' を返します。

アプリケーション全体のロケールとしてロケール 'de' を設定したつもりになりましょう。 Zend_Filter_NormalizedToLocalizedは設定されたロケールを受け取って、 どの種類の出力をあなたが受け取りたいのか検出するために、それを使います。 われわれの例ではそれは精度を持つ値でした。 そこで、この値を文字列としてローカライズした表現をフィルタは返します。

ローカライズした数がどのようになるべきか、コントロールすることもできます。 このためにZend_Locale_Formatでも使用されるオプションを 全て与えられます。 最も一般的なのは下記です。

  • date_format

  • locale

  • precision

それらのオプションの利用法について詳しくは、 Zend_Locale をご覧下さい。

下記はオプションの動作方法が分かるように精度を定義した例です。

  1. //数値フィルタ
  2. $filter = new Zend_Filter_NormalizedToLocalized(array('precision' => 2));
  3.  
  4. $filter->filter(123456);
  5. //値 '123.456,00' を返します。
  6.  
  7. $filter->filter(123456.78901);
  8. //値 '123.456,79' を返します。

日時のローカライズ

日付や時刻の値を正規化したものもまた、ローカライズできます。 与えられた日付および時刻は全て、設定されたロケールで定義された形式で 文字列として返されます。

  1. //フィルタを初期化
  2. $filter = new Zend_Filter_NormalizedToLocalized();
  3. $filter->filter(array('day' => '12', 'month' => '04', 'year' => '2009');
  4. // '12.04.2009' を返します。

ふたたびロケール 'de' を設定したつもりになりましょう。 そこで、入力は自動的に日付として検出され、 ロケール 'de' で定義された形式で返されます。

もちろん、日付の入力値をどのようにするか date_formatlocaleオプションで コントロールすることもできます。

  1. //日付フィルタ
  2. $filter = new Zend_Filter_LocalizedToNormalized(
  3.     array('date_format' => 'ss:mm:HH')
  4. );
  5.  
  6. $filter->filter(array('hour' => '33', 'minute' => '22', 'second' => '11'));
  7. // '11:22:33' を返します。

StripNewlines

文字列 $value から一切の改行制御文字を取り除いたものを返します。

RealPath

このフィルタは与えられたリンクとパス名を解決して、正規化された絶対パス名を返します。 '/./''/../'への参照、 及び、入力パスの余分な'/'記号は取り除かれます。 結果のパスにはいかなるシンボリックリンクも無く、 '/./''/../'文字もありません。

たとえばファイルが存在しない場合、 Zend_Filter_RealPathは失敗するとFALSEを返します。 もし最後のパスのコンポーネントだけが存在しない場合、 BSDシステムではZend_Filter_RealPathは失敗しますが、 他のシステムではFALSEを返します。

  1. $filter = new Zend_Filter_RealPath();
  2. $path   = '/www/var/path/../../mypath';
  3. $filtered = $filter->filter($path);
  4.  
  5. // '/www/mypath' を返します。

それらが存在しないとき、 たとえば、生成したいパスのために実際のパスを取得したいとき、 パスを得るためにしばしば役に立ちます。 初期化でFALSEを渡すこともできますし、 それを設定するために setExists()を使うこともできます。

  1. $filter = new Zend_Filter_RealPath(false);
  2. $path   = '/www/var/path/../../non/existing/path';
  3. $filtered = $filter->filter($path);
  4.  
  5. // file_exists または realpath が false を返すときでも
  6. // '/www/non/existing/path' を返します。

StringToLower

文字列 $value の英字を小文字に変換したものを返します。

StringToUpper

文字列 $value の英字を大文字に変換したものを返します。

StringTrim

文字列 $value の先頭と末尾から文字を取り除いたものを返します。

StripTags

入力文字列からすべての HTML タグおよび PHP タグを取り除いた結果を返します。 ただし明示的に許可したタグは取り除きません。 どのタグを許可するかだけではなく、すべてのタグにおいてどの属性を許可するか、 特定のタグだけで許可する属性は何かなども指定できます。 また、コメント (<!-- ... -->) を除去するかそのまま残すかも指定できます。


導入
blog comments powered by Disqus

Select a Version

Languages Available

Components

Search the Manual