【问题标题】:phalcon validation cirillic utf8phalcon 验证 cirillic utf8
【发布时间】:2018-01-21 09:19:03
【问题描述】:

我尝试在我的 Phalcon 模型中验证 Alnum。但是当我在 Cyrillic (utf8) 中输入符号时,我得到的验证不正确

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

【问题讨论】:

    标签: validation utf-8 phalcon


    【解决方案1】:

    Phalcon 的验证服务使用 PHP 内置的 ctype_alnum 函数 (as seen here),不支持多字节字符串。

    用于测试的快速 sn-ps:

    $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

    更新:来自 cmets 的@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, 
    ]));
    

    【讨论】:

    • 在我的模型方法 validate 中,我添加了验证器回调函数: $validator->add( 'city', new Callback([ 'callback' => function () { if (empty($this- >subway)) { return true; } return (0 != preg_match("/[\w\d\s\-А-Яа-я]+/u", $this->subway)); }, '消息' => 'Поле метро содержит недопустимые символы', 'cancelOnFail' => true, ]));
    • 谢谢。希望添加您的解决方案以帮助其他人:)
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 2020-07-05
    • 2014-07-06
    • 1970-01-01
    • 2016-12-24
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多