爾康的驗證服務使用內置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_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,
]));
了詳盡的回答非常感謝和鏈接 –
很高興幫助:)你是如何解決問題了嗎? –
在我的模型的方法驗證我添加到驗證回調函數: 用$ validator->添加( '城市', 新的回調([ '回調'=>函數(){ 如果(空($這個 - >地鐵)) { return true; } return(0!= preg_match(「/ [\ w \ d \ s \-А-Яа-я] +/u」,$ this-> subway)); ' }, 'message'=>'л'',,' –