2017-08-13 12 views
0

私はPhalconモデルで検証Alnumを試してみます。私はphalcon validation cirillic utf8

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

答えて

0

Phalconの検証サービスは、マルチバイト文字列をサポートしていませんctype_alnum機能(as seen here)、内蔵のPHPを使用しているキリル文字(UTF8)で記号を入力するときしかし、私は、正しい検証をしませ得ます。テストのための

クイック抜粋:

$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_alnumまたはHow 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

iは、コールバック関数をバリデータに追加: を$ validator->( '都市'、 新しいコールバック([ 'コールバック' =>関数(){ 場合(空(の$ this - >を追加地下鉄)) {戻り真; }! リターン(0 =するpreg_match( "/ [\ W \ D \ S \-А-Яа-я] +/U" の$ this - >地下鉄))。 }、 'message' => 'Полеметросодержитнедопустимыесимволы'、 'cancelOnFail' => true、])); –