Zend Frameworkで日本式の電話番号のフォーマットチェックをするプラグイン。
欲しい感じのが無かったからこの記事参考にして作ってみた。半角全角チェック、ハイフンの有無について指定できます。
Class
library/Custom/Validate/Telephone.pnp
<?php require_once 'Zend/Validate/Abstract.php'; class Custom_Validate_Telephone extends Zend_Validate_Abstract { const INVALID = 'invalid'; const NO_HYPHNATE = 'noHyphnate'; const NO_ALLNUM = 'noAllnum'; const NO_SMALLSIZE = 'noSmallsize'; const NO_FULLSIZE = 'noFullsize'; protected $_messageTemplates = array( self::INVALID => '書式が正しくありません。', //Invalid telephone number self::NO_HYPHNATE => 'ハイフンを使用してください', //Please use a hyphen self::NO_ALLNUM => '数字だけで記入してください', //Please enter only numbers self::NO_SMALLSIZE => '全角文字は使用できません', //Can not use double-byte characters self::NO_FULLSIZE => '半角文字は使用できません' //Can not use single-byte characters ); /** * @var string */ protected $_format = ''; /** * @var string */ protected $_character = ''; /** * Sets validator options * * $options is an array the either contains the following keys * * [format] * hyphnate : ハイフネーションされているならtrue * allnum : 数字だけならtrue * NULL : ハイフネーションの有無を限定しない * * [character] * small : 半角数字と半角ハイフンだけ有効 * full : 全角数字と全角ハイフンだけ有効 * NULL : 限定しない * * @param array $option * @return void */ public function __construct(array $options = array()) { foreach ($options as $opt => $val){ $func = 'set' . ucfirst($opt); if (method_exists($this, $func)){ $this->$func($val); } } } public function setCharacter($val) { if(!empty($val)){ $this->_character = $val; } return $this; } public function setFormat($val){ if(!empty($val)){ $this->_format = $val; } return $this; } public function isValid($value) { $this->_setValue($value); $valueString = trim((string)$value); if($this->_character==='small'){ if(!preg_match("/^[\d\-]+$/", $valueString)){ $this->_error(self::NO_SMALLSIZE); return false; } } if($this->_character==='full'){ if(!preg_match("/^[0-9ー‐-]+$/", $valueString)){ $this->_error(self::NO_FULLSIZE); return false; } } $valueString = mb_convert_kana($valueString, "n", 'UTF-8'); $valueString = str_replace(array('ー','‐','-','―'), '-', $valueString); if(! preg_match("/^(\d{2,5}?\-\d{1,4}?\-\d{3,4})|(\d{10,13})$/", $valueString)){ $this->_error(self::INVALID); return false; } if(!empty($this->_format)){ $fnc = 'is' . ucfirst($this->_format); return $this->$fnc($valueString); }else{ if(strpos($valueString,"-")===false){ return $this->isAllNum($valueString); }else{ return $this->isHyphnate($valueString); } } } public function isHyphnate($value) { if (!preg_match("/(^(?<!090|080|070)(^\d{2,5}?\-\d{1,4}?\-\d{4}$|^[\d\-]{12}$))|(^(090|080|070)(\-\d{4}\-\d{4}|[\\d-]{13})$)|(^0120(\-\d{2,3}\-\d{3,4}|[\d\-]{12})$)|(^0080\-\d{3}\-\d{4})/", $value)) { if(!empty($this->_format)) $this->_error(self::NO_HYPHNATE); else $this->_error(self::INVALID); return false; }else{ return true; } } public function isAllnum($value) { if (!preg_match("/(^(?<!090|080|070)\d{10}$)|(^(090|080|070)\d{8}$)|(^0120\d{6}$)|(^0080\d{7}$)/", $value)) { if(!empty($this->_format)) $this->_error(self::NO_ALLNUM); else $this->_error(self::INVALID); return false; }else{ return true; } } }
Options
連想配列で指定する。
format
hyphnate : ハイフネーションされているならtrue
allnum : 数字だけならtrue
NULL : ハイフネーションの有無を限定しない
character
small : 半角数字と半角ハイフンだけ有効
full : 全角数字と全角ハイフンだけ有効
NULL : 限定しない
使い方
$tel = new Zend_Form_Element_Text($fieldName); $telValidator = new Custom_Validate_Telephone(); $tel->addValidator($telValidator, true)->setLabel("電話番号"); $form->addElement($tel);
$this->addElementPrefixPath('Custom_Validate', 'Custom/Validate/', Zend_Form_Element::VALIDATE); $this->addElement('text', 'tel', array( 'label' => '電話番号', 'required' => false, 'validators' => array( array('validator' =>'Telephone','options'=>array('format'=>'hyphnate','character'=>'small')) ) ));