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'))
)
));