2011-01-07 2 views
3

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

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

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

Любые идеи?

+1

Любой шанс вы можете вставить свой ошибочный '$ input'? Мне очень интересно видеть эту ошибку. –

ответ

0

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

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

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

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

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

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

+0

Отказ от ответственности: это было чисто исследование; Я сам не пробовал. –

+0

Привет, я уже использую UTF8, как правило, даже для английского - проблема si не с UTF8 больше с многобайтными символами, я обновил описание –

+0

@SherifBuzz: Насколько я понимаю, это флаг поддержки PCRE. Multibyte несколько присущ UTF-8. [Single-character] ASCII считается иначе. Могу ли я спросить, как вы знаете, что ваши английские строки являются многобайтными? –

6

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

ли это:

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

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

0

Даже в режиме 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); 

See it in action on ideone.com

Если вам нужно, чтобы соответствовать определенным символам или диапазоны, вы можете использовать либо последовательность \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{} были переданы для обработки компилятором регулярных выражений, но на этот раз мы хотим, чтобы компилятор расширял escape-последовательности. Это не происходит в строках с одной кавычкой.

 Смежные вопросы

  • Нет связанных вопросов^_^