第22章 Zend_Filter

目次

22.1. 導入
22.1.1. フィルタとは?
22.1.2. フィルタの基本的な使用法
22.1.3. 静的メソッド staticFilter() の使用法
22.1.3.1. 名前空間
22.2. 標準のフィルタクラス群
22.2.1. Alnum
22.2.2. Alpha
22.2.3. BaseName
22.2.4. Callback
22.2.5. Compress and Decompress
22.2.5.1. Generic handling
22.2.5.2. Creating an archive
22.2.5.3. Decompressing an archive
22.2.5.4. Bz2 Adapter
22.2.5.5. Gz Adapter
22.2.5.6. Lzf Adapter
22.2.5.7. Rar Adapter
22.2.5.8. Tar Adapter
22.2.5.9. Zip Adapter
22.2.6. Decrypt
22.2.6.1. Mcrypt の復号
22.2.6.2. OpenSSL の復号
22.2.7. Digits
22.2.8. Dir
22.2.9. Encrypt
22.2.9.1. Mcrypt での暗号化
22.2.9.2. OpenSSL での暗号化
22.2.10. HtmlEntities
22.2.11. Int
22.2.12. LocalizedToNormalized
22.2.12.1. 数値の正規化
22.2.12.2. 日時の正規化
22.2.13. NormalizedToLocalized
22.2.13.1. 数値のローカライズ
22.2.13.2. 日時のローカライズ
22.2.14. Null
22.2.14.1. Zend_Filter_Null の既定の振る舞い
22.2.14.2. Zend_Filter_Null の振る舞いの変更
22.2.15. StripNewlines
22.2.16. RealPath
22.2.17. StringToLower
22.2.18. StringToUpper
22.2.19. StringTrim
22.2.20. StripTags
22.3. フィルタチェイン
22.4. フィルタの書き方
22.5. Zend_Filter_Input
22.5.1. フィルタルールおよび検証ルールの宣言
22.5.2. フィルタおよびバリデータの処理装置の作成
22.5.3. 検証済みのフィールドやその他の結果情報の取得
22.5.3.1. 入力が妥当かどうかの問い合わせ
22.5.3.2. 無効なフィールド、存在しないフィールド、未知のフィールドの取得
22.5.3.3. 有効なフィールドの取得
22.5.4. メタコマンドによるフィルタルールやバリデータルールの制御
22.5.4.1. FIELDS メタコマンド
22.5.4.2. PRESENCE メタコマンド
22.5.4.3. DEFAULT_VALUE メタコマンド
22.5.4.4. ALLOW_EMPTY メタコマンド
22.5.4.5. BREAK_CHAIN メタコマンド
22.5.4.6. MESSAGES メタコマンド
22.5.4.7. オプションの使用による、全ルールへのメタコマンドの設定
22.5.5. フィルタクラスへの名前空間の追加
22.6. Zend_Filter_Inflector
22.6.1. 操作
22.6.2. その他のフィルタ向けのパスの設定
22.6.3. インフレクタのターゲットの設定
22.6.4. インフレクションのルール
22.6.4.1. 静的なルール
22.6.4.2. Filter Inflector ルール
22.6.4.3. 多くのルールを一度に設定する
22.6.5. ユーティリティメソッド
22.6.6. Zend_Filter_Inflector での Zend_Config の使用法
22.7. 前バージョンからの移行
22.7.1. バージョン 1.9以前からの移行

22.1. 導入

Zend_Filter コンポーネントは、データのフィルタリングに必要となる一般的な機能を提供します。 シンプルなフィルタチェイン機能も持っており、 ひとつのデータに対して複数のフィルタを指定した順に適用することができます。

22.1.1. フィルタとは?

自然界におけるフィルタの典型的な使用法は、 入力から不要な部分を除去して必要なものだけを出力することです (例: コーヒーのフィルタ)。 このような場合、フィルタは入力の一部を取り出すための演算子となります。 この型のフィルタリングはウェブアプリケーションで有用です。 たとえば不正な入力を除去したり、余分な空白を除去したりといったことが考えられます。

この基本的なフィルタの定義を拡張して、入力に一般的な変換を加える処理もフィルタに含めることにしましょう。 ウェブアプリケーションでよくある変換は、HTML エンティティのエスケープ処理です。 たとえば (ウェブブラウザなどからの) 信頼できない入力をもとにして フォームのフィールドに値を自動的に埋め込む場合は、その値には HTML エンティティが含まれてはいけません。あるいはもし含むならそれをエスケープしておかなければなりません。 これにより、予期せぬ振る舞いを起こすことを防ぎ、 セキュリティ上の脆弱性も防ぎます。 この要求を満たすには、入力に含まれる HTML エンティティを削除あるいはエスケープしなければなりません。 もちろん、どちらの方式が適切かはその場の状況に依存します。 HTML エンティティを除去するフィルタは、最初に定義したフィルタの考え方 - 入力の一部を取り出すための演算子 - にもとづくものです。 一方、HTML エンティティをエスケープするフィルタは、入力を変換するタイプのものです (たとえば "&" は "&" に変換されます)。 これらの例のような処理はウェブ開発者にとって重要です。 Zend_Filter で "フィルタリングする" という場合、 それは入力データに対して何らかの変換を行うことを意味します。

22.1.2. フィルタの基本的な使用法

ここで考えたフィルタについての定義をもとにして Zend_Filter_Interface が作成されました。 これは、フィルタクラスに対して filter() という名前のメソッドを実装するよう強制するものです。

以下の例は、アンパサンド (&) およびダブルクォート (") の二つの入力データに対してフィルタを適用するものです。

$htmlEntities = new Zend_Filter_HtmlEntities();

echo $htmlEntities->filter('&'); // &
echo $htmlEntities->filter('"'); // "

22.1.3. 静的メソッド staticFilter() の使用法

指定したフィルタクラスを読み込んでそのインスタンスを作成するというのが面倒ならば、 もうひとつの方法として、静的メソッド Zend_Filter::filterStatic() を実行する方法もあります。このメソッドの最初の引数には、 filter() メソッドに渡す入力値を指定します。 二番目の引数は文字列で、フィルタクラスのベースネーム (Zend_Filter 名前空間における相対的な名前) を指定します。 staticFilter() メソッドは自動的にクラスを読み込んでそのインスタンスを作成し、 指定した入力に対して filter() メソッドを適用します。

echo Zend_Filter::filterStatic('&', 'HtmlEntities');

フィルタクラスのコンストラクタにオプションを指定する必要がある場合は、 それを配列で渡すことができます。

echo Zend_Filter::filterStatic('"', 'HtmlEntities', array('quotestyle' => ENT_QUOTES));

この静的な使用法は、その場限りのフィルタリングには便利です。 ただ、複数の入力に対してフィルタを適用するのなら、 最初の例の方式、つまりフィルタオブジェクトのインスタンスを作成して その filter() メソッドをコールする方式のほうがより効率的です。

また、Zend_Filter_Input クラスでも、特定の入力データのセットを処理する際に 複数のフィルタやバリデータを必要に応じて実行させる機能も提供しています。 詳細は 項22.5. 「Zend_Filter_Input」 を参照ください。

22.1.3.1. 名前空間

自分で定義したフィルタを使う際に、 Zend_Filter::filterStatic() に 4 番目のパラメータを指定することができます。 これは、フィルタを探すための名前空間となります。

echo Zend_Filter::filterStatic(
    '"',
    'MyFilter',
    array($parameters),
    array('FirstNamespace', 'SecondNamespace')
);

Zend_Filter には、名前空間をデフォルトで設定することもできます。 つまり、起動時に一度設定しておけば Zend_Filter::filterStatic() のたびに指定する必要がなくなるということです。 次のコード片は、上のコードと同じ意味となります。

Zend_Filter::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
echo Zend_Filter::filterStatic('"', 'MyFilter', array($parameters));
echo Zend_Filter::filterStatic('"', 'OtherFilter', array($parameters));

名前空間の操作のために、次のような便利なメソッド群が用意されています。

  • Zend_Filter::getDefaultNamespaces(): 設定されているすべての名前空間を配列で返します。

  • Zend_Filter::setDefaultNamespaces(): 新たなデフォルト名前空間を設定し、既存の名前空間を上書きします。 単一の名前空間の場合は文字列、複数の場合は配列で指定することができます。

  • Zend_Filter::addDefaultNamespaces(): 新たな名前空間を、既に設定されているものに追加します。 単一の名前空間の場合は文字列、複数の場合は配列で指定することができます。

  • Zend_Filter::hasDefaultNamespaces(): デフォルトの名前空間が設定されている場合は true、 設定されていない場合は false を返します。