Проверка формы CodeIgniter для китайских слов

Я использую библиотеку проверки формы в CodeIgniter. Ниже в конфигурации попробуйте включить все числа, английские слова, китайские слова и пробел. Но это не работа.

$config = array(
                array(
                       'field' => 'keywords',
                       'label' => 'keywords',
                       'rules' => 'regex_match[/[a-zA-Z0-9 \u4e00-\u9fa5]+$/]'
                    )
                );

Однако, если я вывожу '一-龥', это работает.

$config = array(
                    array(
                           'field' => 'keywords',
                           'label' => 'keywords',
                           'rules' => 'regex_match[/[a-zA-Z0-9 ]+$/]'
                        )
                    );

person IvanK    schedule 03.07.2016    source источник
comment
Попробуйте /^[a-zA-Z0-9\s\p{Han}]+$/, как и в PCRE, вы можете сопоставлять китайские символы со свойством Unicode \p{Han}.   -  person Wiktor Stribiżew    schedule 03.07.2016
comment
Я проверяю это. Он может проверять английские слова и пространство. Но китайское слово не работает.   -  person IvanK    schedule 03.07.2016


Ответы (2)


В вашем регулярном выражении есть три проблемы:

  • Регулярное выражение проверки должно начинаться с начала строки, поэтому вам нужно начало строки привязки ^ или \A. Кроме того, рекомендуется заменить $ на самый конец якоря строки \z (поскольку $ также совпадает перед последним символом новой строки в строке).
  • Рево прав, нотация \uXXXX не поддерживается механизмом регулярных выражений PHP. Однако вам не нужно указывать здесь диапазон кодовых точек Unicode. Китайские символы в регулярном выражении PHP PCRE можно определить с помощью свойства Unicode \p{Han}.
  • Чтобы регулярное выражение PCRE стало совместимо с Unicode, вам нужно использовать модификатор /u.

Итак, используйте

/\A[a-zA-Z0-9\s\p{Han}]+\z/u

Или (немного менее безопасно),

/^[a-zA-Z0-9\s\p{Han}]+$/u
person Wiktor Stribiżew    schedule 03.07.2016
comment
Я тестирую два метода. Оба метода могут проверять английские слова и пробелы. Но китайское слово не работает. - person IvanK; 03.07.2016
comment
Предоставьте пример входной строки. он соответствует китайским словам. - person Wiktor Stribiżew; 03.07.2016
comment
Я не уверен насчет OP, но \p{Han} включает в себя гораздо больше символов, чем предоставленный диапазон. Например. \x{3400}-\x{4dbf} (Расширение A унифицированных иероглифов CJK) - person revo; 03.07.2016
comment
Кому: revo Что подходит для традиционных китайских слов Кому: Виктору Стрибижеву Это нормально на веб-сайте онлайн-теста, но не работает в моем коде. - person IvanK; 03.07.2016
comment
Я забыл про модификатор /u. Попробуйте /^[a-zA-Z0-9\s\p{Han}]+$/u. - person Wiktor Stribiżew; 03.07.2016
comment
Если это не сработает, вам нужно будет реализовать обратный вызов, например здесь . - person Wiktor Stribiżew; 03.07.2016
comment
Спасибо, Виктор Стрибижев. Сейчас работа. И я ищу разницу между \p{Han} и \x{3400}-\x{4dbf} в Google. Я не очень уверен, но я думаю, что они одинаковы. Если кто-нибудь найдет разницу, пожалуйста, дайте мне знать. Спасибо. - person IvanK; 03.07.2016
comment
Возможно, Han включает более одного диапазона. См. исходный код PHP. - person Wiktor Stribiżew; 03.07.2016
comment
@IvanK: Если это сработает, рассмотрите возможность принятия ответа. - person Wiktor Stribiżew; 13.09.2016

PCRE не поддерживает синтаксис \uFFFF. Вместо этого используйте \x{FFFF}.

/[a-zA-Z0-9 \x{4e00}-\x{9fa5}]+$/
person revo    schedule 03.07.2016
comment
Я проверяю это. он не может проверять китайские слова, английские слова и пробел. - person IvanK; 03.07.2016
comment
@IvanK Предоставляя образец Виктора, это регулярное выражение должно работать. - person revo; 03.07.2016
comment
Это нормально на веб-сайте онлайн-тестирования, но не работает в моем коде. - person IvanK; 03.07.2016
comment
@IvanK Здесь также можно использовать модификатор u: /[a-zA-Z0-9 \x{4e00}-\x{9fa5}]+$/u - person revo; 06.07.2016