2017-08-13 100 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'=>'л'',,' –