Zend_Validate_Regexで日本語を使うときの注意

Zend FrameworkのZend_Validate_Regexでは、正規表現を書いてバリデーションを行うことができます。
Zend_ValidateにはAlnum(アルファベットや数字)、Alpha、Digits、Dateのような使う頻度が多そうなものから、Barcodeなど変わり種のものまで、さまざまなバリデーションクラスが用意されていますが、日本語に対応するものは用意されていないので、自分でバリデーションクラスを作ってしまうか、もしくはZend_Validate_Regexを使う必要があります。

頻繁に使うのならば、可読性を高めるためにもバリデーションクラスを自作してしまうほうがいいのですが、ちょっとした処理をするのならばZend_Validate_Regexを使ってしまうのもいいかと。

そんなわけでZend_Validate_Regexを使って半角カナの処理をしていたわけですが、どうも思ったような挙動になってくれない。

  new Zend_Validate_Regex('/^[。-゚]+$/')

こんな感じで書いても、
「アイウエオ」にはマッチするが「タカハシ」にはマッチしてくれない。

なぜだー!と思いZend_Validate_Regexのソースを読んでみると、

        $this->_setValue($valueString);

        $status = @preg_match($this->_pattern, $valueString);
        if (false === $status) {
            /**
             * @see Zend_Validate_Exception
             */
            require_once 'Zend/Validate/Exception.php';
            throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$valueString'");
        }

こんな感じで単にpreg_matchで処理しているだけの様子。
もうすこし調べていると、こんなものを発見。

パターン修飾子

u (PCRE_UTF8)
この修正子は、Perl 非互換な PCRE の機能を有効にします。パターン 文字列は、UTF-8 エンコードされた文字列として処理されます。 この修正子は、UNIX では PHP 4.1.0 以降、Win32 では PHP 4.2.3 以降で 使用可能です。 また、PHP 4.3.5 以降では、パターンの UTF-8 としての妥当性も確認されます。

・・・なるほど、/uオプションを付ける必要があったのね。

  new Zend_Validate_Regex('/^[。-゚]+$/u')

このような感じに変更したところ、意図したとおりの動作に。
半角カナに限らず、UTF-8を利用するときは必ずuオプションを付けるようにしたほうがいいかも。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://jaco.dotstyle.net/2009/02/zend_validate_regex%e3%81%a7%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e4%bd%bf%e3%81%86%e3%81%a8%e3%81%8d%e3%81%ae%e6%b3%a8%e6%84%8f/trackback/
Listed below are links to weblogs that reference
Zend_Validate_Regexで日本語を使うときの注意 from JB_Plus
Search
Feeds
Meta

Return to page top