- 2009-02-27 (金) 11:52
- PHP
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オプションを付けるようにしたほうがいいかも。
- Newer: PDO(Zend_Db)+SQL Server(ODBC)でStatement使うと型が無視られてTextになる
- Older: 次期UbuntuにはNotifyOSDというGrowlっぽい機能がつく
Comments:0
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