регулярное выражение для определения последовательных чисел - не работает для неанглийского ввода - PullRequest
3 голосов
/ 07 января 2011

Привет всем У меня есть этот код, который проверяет наличие 5 или более последовательных чисел:

if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;

Он отлично работает для ввода на английском языке, но срабатывает, когда строка ввода содержит арабские / многобайтовые символыиногда он возвращает true, даже если во входном тексте нет чисел.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 13 января 2011

Вы, похоже, используете PHP.

Сделайте это:

if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;

Обратите внимание на модификатор 'u' в конце выраженияОн говорит preg_ * использовать юникодный режим для сопоставления.

0 голосов
/ 17 января 2011

Даже в режиме UTF-8 предопределенные классы символов, такие как \d и [[:digit:]], соответствуют только символам ASCII.Чтобы сопоставить потенциально не ASCII-цифры, вы должны использовать эквивалентное свойство Unicode, \p{Nd}:

$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5";
preg_match_all('~\p{Nd}{5}~u', $s, $matches);

См. Его в действии на ideone.com

вам нужно сопоставить определенные символы или диапазоны, вы можете использовать escape-последовательность \x{HHHH} с соответствующими кодовыми точками:

preg_match_all('~[\x{0661}-\x{0665}]{5}~u', $s, $matches);

... или использовать форму \xHH для ввода их UTF-8закодированные последовательности байтов:

preg_match_all("~[\xD9\xA1-\xD9\xA5]{5}~u", $s, $matches);

Обратите внимание, что я переключился на двойные кавычки для этого последнего примера.Формы \p{} и \x{} были переданы для обработки компилятором regex, но на этот раз мы хотим, чтобы компилятор PHP расширил escape-последовательности.Этого не происходит в одиночных кавычках.

0 голосов
/ 07 января 2011

Вы должны правильно настроить себя, когда хотите иметь дело с UTF-8.

Вы можете перекомпилировать php с включенным флагом PCRE UTF-8.

Или вы можете добавить последовательность (*UTC8) в начало вашего регулярного выражения. Например:

/(*UTF8)[[:alnum:]]/, вход é, выход TRUE

/[[:alnum:]]/, вход é, выход FALSE.

Проверьте http://www.pcre.org/pcre.txt,, который содержит много информации о поддержке UTF-8 в библиотеке PCRE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...