51.2. 標準のバリデーションクラス群

Zend Framework には、すぐに使える標準のバリデーションクラス群が同梱されています。

51.2.1. Alnum

$value がアルファベットおよび数字のみで構成されているときにのみ true を返します。 このバリデータでは、オプションとして空白文字を認めることもできます。

[注意] 注意

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

51.2.2. Alpha

$value がアルファベットのみで構成されているときにのみ true を返します。 このバリデータでは、オプションとして空白文字を認めることもできます。

51.2.3. Barcode

このバリデータのインスタンスを作成する際には、検証したいバーコードの形式を指定します。 現在サポートしているバーコード形式は "UPC-A" (Universal Product Code) と "EAN-13" (European Article Number) です。 isValid() メソッドは、 指定した型のバーコードの検証アルゴリズムで入力が検証できた場合に true を返します。このバリデータに入力を渡す前に、 数字の 0 から 9 まで (0-9) 以外の文字はすべて取り除いておかなければなりません。

51.2.4. Between

$value が最小値と最大値の間にある場合にのみ true を返します。 デフォルトでは、両端の値も含めて比較します ($value が境界値と等しくてもかまいません) が、strict オプションを変更して、$value が最小値より大きくて最大値より小さい (最小値と最大値は含まない) とすることもできます。

51.2.5. Ccnum

$value が Luhn アルゴリズム (10 で割ったあまりのチェックサム) を満たすクレジットカード番号である場合にのみ true を返します。

51.2.6. Date

$valueYYYY-MM-DD 形式の日付である場合にのみ true を返します。オプションの locale を設定すると、そのロケールに応じた検証を行います。 オプションの format を設定すると、 そのフォーマットを使用して検証を行います。オプションパラメータの詳細は Zend_Date::isDate() を参照ください。

51.2.7. Digits

$value が数字のみで構成されている場合にのみ true を返します。

51.2.8. メールアドレス

Zend_Validate_EmailAddress は、メールアドレスの検証を行います。 このバリデータは、まずメールアドレスを local-part @ hostname に分割し、メールアドレスやホスト名の仕様にあわせて検証します。

基本的な使用法

基本的な使用法は、以下のようになります。

$validator = new Zend_Validate_EmailAddress();
if ($validator->isValid($email)) {
    // メールアドレスは正しい形式のようです
} else {
    // 不正な形式なので、理由を表示します
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

        

これは、メールアドレス $email を検証し、失敗した場合は その原因を表す便利なエラーメッセージを $validator->getMessages() で取得します。

複雑なローカルパート

Zend_Validate_EmailAddress は、メールアドレスの検証を RFC2822 にもとづいて行います。たとえば、妥当な形式のメールアドレスとしては bob@domain.combob+jones@domain.us"bob@jones"@domain.com および "bob jones"@domain.com などがあります。

かつて使われていたものの、現在は有効とはみなされないフォーマットもあります (たとえば、メールアドレスに改行文字や "\" を使用するなど)。

さまざまな形式のホスト名の検証

メールアドレスのホスト名部分の検証は、 Zend_Validate_Hostname で行います。デフォルトでは、domain.com 形式の DNS ホスト名のみが有効となります。しかし、 IP アドレスやローカルホスト名も有効にしたいこともあるでしょう。

その場合は、Zend_Validate_EmailAddress のインスタンスを作成する際にパラメータを渡さなければなりません。 このパラメータで、認めたいホスト名の形式を指定します。 詳細は Zend_Validate_Hostname を参照ください。 たとえば DNS ホスト名およびローカルホスト名のどちらも許可するには、次のようにします。

$validator = new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNS | Zend_Validate_Hostname::ALLOW_LOCAL);
if ($validator->isValid($email)) {
    // メールアドレスは正しい形式のようです
} else {
    // 不正な形式なので、理由を表示します
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

        

そのホスト名が実際にメールを受け付けるかどうかのチェック

ただ単にメールアドレスが正しい書式であるというだけでは、 そのアドレスが実際に存在するかどうかはわかりません。 この問題を解決するには、MX の検証を行います。 メールアドレスのホスト名に対応する DNS レコードに、MX (メール) のエントリが存在するかどうかを調べるのです。 これは、そのホストがメールを受け付けているかどうかを教えてはくれますが、 そのメールアドレス自体が正しいものであるかどうかを知ることはできません。

MX のチェックはデフォルトでは無効になっており、 現時点では UNIX プラットフォームでのみサポートしています。 MX のチェックを有効にするには、Zend_Validate_EmailAddress コンストラクタの 2 番目のパラメータを渡します。 constructor.

$validator = new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNS, true);
        

あるいは、true または false$validator->setValidateMx() に渡すことで、 MX の検証を有効あるいは無効にすることもできます。

この設定を有効にすると、ネットワーク関数を用いて メールアドレスのホスト名部に対する MX レコードの存在チェックをします。 これにより、スクリプトの処理速度が低下することに気をつけてください。

国際化ドメイン名の検証

Zend_Validate_EmailAddress は、ドメインの中に国際文字が使われている場合も処理できます。 このようなドメインは、国際化ドメイン名 (International Domain Name: IDN) と呼ばれています。これはデフォルトで有効になっていますが、無効にすることも可能です。 無効にするには、Zend_Validate_EmailAddress が内部で保持している Zend_Validate_Hostname オブジェクトの設定を変更します。

$validator->hostnameValidator->setValidateIdn(false);
        

setValidateIdn() の詳細な使用法は、 Zend_Validate_Hostname のドキュメントを参照ください。

IDN の検証は、DNS ホスト名の検証を有効にしている場合にのみ行われることに注意しましょう。

トップレベルドメインの検証

デフォルトでは、ホスト名の検証は既知の TLD の一覧に基づいて行われます。 これはデフォルトで有効になっていますが、無効にすることもできます。無効にするには、 無効にするには、Zend_Validate_EmailAddress が内部で保持している Zend_Validate_Hostname オブジェクトの設定を変更します。

$validator->hostnameValidator->setValidateTld(false);
        

setValidateTld() の詳細な使用法は、 Zend_Validate_Hostname のドキュメントを参照ください。

TLD の検証は、DNS ホスト名の検証を有効にしている場合にのみ行われることに注意しましょう。

51.2.9. Float

$value が浮動小数点値である場合にのみ true を返します。 Zend Framework 1.8 以降では、このバリデータは ブラウザや環境変数あるいはアプリケーションで設定されたロケールを考慮するようになります。 もちろん、アクセサ get/setLocale を使用して、 バリデータのインスタンスを作成する際に使用するロケールを変更することもできます。

51.2.10. GreaterThan

$value が最小値よりも大きい場合にのみ true を返します。

51.2.11. Hex

$value が16進文字のみで構成されている場合にのみ true を返します。

51.2.12. ホスト名

Zend_Validate_Hostname は、ホスト名が仕様を満たしているかどうかの検証を行います。 三種類の形式のホスト名、つまりDNS ホスト名 (たとえば domain.com)、IP アドレス (たとえば 1.2.3.4) そしてローカルホスト名 (たとえば localhost) の検証が可能です。 デフォルトでは DNS ホスト名のみが有効となります。

基本的な使用法

基本的な使用法は、以下のようになります。

$validator = new Zend_Validate_Hostname();
if ($validator->isValid($hostname)) {
    // ホスト名は正しい形式のようです
} else {
    // 不正な形式なので、理由を表示します
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

        

これは、ホスト名 $hostname を検証し、失敗した場合は その原因を表す便利なエラーメッセージを $validator->getMessages() で取得します。

さまざまな形式のホスト名の検証

IP アドレスやローカルホスト名、あるいはその両方を正しいホスト名として認めたいこともあるでしょう。 その場合は、Zend_Validate_Hostname のインスタンスを作成する際にパラメータを渡します。 このパラメータには、どの形式のホスト名を許可するのかを表す整数値を指定しなければなりません。 できるだけ、Zend_Validate_Hostname の定数を使用するようにしましょう。

Zend_Validate_Hostname の定数は次のとおりです。ALLOW_DNS は DNS ホスト名のみを許可し、 ALLOW_IP は IP アドレスを許可します。また ALLOW_LOCAL はローカルネットワーク名を許可し、ALLOW_ALL はこれら三種類をすべて許可します。 IP アドレスだけをチェックするには、以下の例のようにします。

$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_IP);
if ($validator->isValid($hostname)) {
    // ホスト名は正しい形式のようです
} else {
    // 不正な形式なので、理由を表示します
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

        

ALLOW_ALL を使用してすべての形式を許可するほかに、 これらの形式を組み合わせることもできます。 たとえば、DNS およびローカルホスト名を許可するには、 Zend_Validate_Hostname のインスタンスを次のように作成します。

$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS | Zend_Validate_Hostname::ALLOW_IP);
        

国際化ドメイン名の検証

国別コードトップレベルドメイン (Country Code Top Level Domains: ccTLDs) の一部、たとえば 'de' (ドイツ) などでは、ドメイン名の中に国際化文字の使用をサポートしています。 これは、国際化ドメイン名 (International Domain Names: IDN) といわれるものです。 これらのドメインについても、Zend_Validate_Hostname の検証プロセスで使用する文字を拡張することで検証することができます。

現在は、次のような ccTLD をサポートしています。

  • at (オーストリア)

  • ch (スイス)

  • li (リヒテンシュタイン)

  • de (ドイツ)

  • fi (フィンランド)

  • hu (ハンガリー)

  • no (ノルウェー)

  • se (スウェーデン)

IDN ドメインに対するマッチングを行う方法は、通常のホスト名の場合とまったく同じです。 というのも、IDN のマッチングはデフォルトで有効になっているからです。 IDN の検証を無効にしたい場合は、Zend_Validate_Hostname のコンストラクタにパラメータを渡すか、あるいは $validator->setValidateIdn() メソッドを使用します。

IDN の検証を無効にするには、Zend_Validate_Hostname のコンストラクタに二番目のパラメータを次のように渡します。

$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS, false);
        

あるいは、TRUE または FALSE を $validator->setValidateIdn() に渡すことで、 IDN の検証を有効あるいは無効にすることもできます。 現在サポートされていない IDN ホスト名に対するマッチングを行おうとすると、 国際化文字が含まれている場合に検証に失敗します。 追加の文字を指定した ccTLD ファイルが Zend/Validate/Hostname に存在しない場合は、通常のホスト名の検証を行います。

IDN の検証は、DNS ホスト名の検証を有効にしている場合にのみ行われることに注意しましょう。

トップレベルドメインの検証

デフォルトでは、ホスト名の検証は既知の TLD の一覧に基づいて行われます。 この機能が不要な場合は、IDN サポートを無効にするのと同じ方法で無効にすることができます。 TLD の検証を無効にするには、Zend_Validate_Hostname のコンストラクタに三番目のパラメータを渡します。 以下の例では、IDN の検証は二番目のパラメータで有効にしています。

$validator = new Zend_Validate_Hostname(Zend_Validate_Hostname::ALLOW_DNS, true, false);
        

あるいは、TRUE または FALSE を $validator->ValidateTld() に渡すことで、 TLD の検証を有効あるいは無効にすることもできます。

TLD の検証は、DNS ホスト名の検証を有効にしている場合にのみ行われることに注意しましょう。

51.2.13. InArray

"needle" $value が "haystack" 配列に含まれる場合にのみ true を返します。strict オプションを true にすると、$value の型も確認します。

51.2.14. Int

$value が整数値である場合にのみ true を返します。 Zend Framework 1.8 以降では、このバリデータは ブラウザや環境変数あるいはアプリケーションで設定されたロケールを考慮するようになります。 もちろん、アクセサ get/setLocale を使用して、 バリデータのインスタンスを作成する際に使用するロケールを変更することもできます。

51.2.15. Ip

$value が妥当な形式の IP アドレスである場合にのみ true を返します。

51.2.16. LessThan

$value が最大値よりも小さい場合にのみ true を返します。

51.2.17. NotEmpty

$value が空の値でない場合にのみ true を返します。

51.2.18. Regex

$value が正規表現パターンにマッチする場合にのみ true を返します。

51.2.19. StringLength

文字列 $value の長さが最小値以上、 かつ最大値以下 (最大値が null 以外のとき) の場合にのみ true を返します。 setMin() で最大値より大きい値を指定したり setMax() で最小値より小さい値を設定したりした場合に例外をスローします。 このクラスは UTF-8 のほかに iconv.internal_encoding にもとづいたその他の文字エンコーディングもサポートします。 別の円コーディングを使用したい場合は、アクセサメソッド getEncoding および setEncoding で設定します。