尔康的验证服务使用内置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'=>'л'',,' –