2017-08-13 103 views
0

我尝试在我的Phalcon模型中验证Alnum。但我得到不正确的验证,当我在西里尔(UTF8)输入符号phalcon验证cirillic utf8

$validation->add(
    'title', 
    new \Phalcon\Validation\Validator\Alnum([ 
     "message" => 'Поле Город содержит недопустимые символы', 
    ]) 
); 

回答

0

尔康的验证服务使用内置ctype_alnum功能(as seen here),它不支持多字节字符串的PHP。

测试快速片段:

$validation = new \Phalcon\Validation(); 
$validation->add(
    'name', 
    new \Phalcon\Validation\Validator\Alnum(
     [ 
      'message' => 'Validation failed', 
     ] 
    ) 
); 
$words = [ 
    'test1234', 
    't__est1234', 
    'тест123', 
]; 
echo '<h2>Phalcon Validation</h2>'; 
foreach ($words as $word) { 
    $messages = $validation->validate(['name' => $word]); 
    if (count($messages)) { 
     echo '[N] '. $word, '<br>'; 
    } else { 
     echo '[Y] '. $word, '<br>'; 
    } 
} 

echo '<h2>PHP `ctype_alnum`</h2>'; 
foreach ($words as $word) { 
    if (ctype_alnum($word)) { 
     echo '[Y] '. $word, '<br>'; 
    } else { 
     echo '[N] '. $word, '<br>'; 
    } 
} 

结果:

Phalcon Validation 
[Y] test1234 
[N] t__est1234 
[N] тест123 


PHP `ctype_alnum` 
[Y] test1234 
[N] t__est1234 
[N] тест123 

恐怕你必须使用preg_match解决您的问题。快速样品:

preg_match("/^[a-zA-Z\p{Cyrillic}0-9\s\-]+$/u", $string); 

来源:Using Arabic characters with ctype_alnumHow to use ctype_alpha with UTF-8

最后,这里是如何创建自己的验证信息:https://docs.phalconphp.com/en/latest/validation#validators

更新:从意见@Vladimir Kompaniec解决方案!

$validator->add('city', new Callback([ 
    'callback' => function() { 
     if (empty($this->subway)) { 
      return true; 
     } 
     return (0 != preg_match("/[\w\d\s\-А-Яа-я]+/u", $this->subway)); 
    }, 
    'message' => 'Поле метро содержит недопустимые символы', 
    'cancelOnFail' => true, 
])); 
+0

了详尽的回答非常感谢和链接 –

+0

很高兴帮助:)你是如何解决问题了吗? –

+1

在我的模型的方法验证我添加到验证回调函数: 用$ validator->添加( '城市', 新的回调([ '回调'=>函数(){ 如果(空($这个 - >地铁)) { return true; } return(0!= preg_match(“/ [\ w \ d \ s \-А-Яа-я] +/u”,$ this-> subway)); ' }, 'message'=>'л'',,' –