2013-06-06 3 views
0

Моя картина: ^([((01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33)(\d{7}))]{9}|(\d{12}))$preg_match-PHP: Как проверить первые 2 цифры в списке

На картинке ниже, 91 нет в списке 01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33 но он все еще вернется.

Как исправить ошибку?

PHP live Regex

ответ

1

Вашего все регулярное выражение говорит: «Найти 9 любых символы из 0-9, скобок, фигурных скобок или символа трубы - в качестве альтернативы найти 12 цифр»

При том, что оно должно быть достаточно очевидно, что вы сделали неправильно.

Попробуйте это регулярное выражение вместо:.

^(?:(?:01|02|35|.....|33)\d{10}|\d{12})$ 
+0

После поиска в google я обнаружил, что '(? :)' не является группой для захвата, но можете ли вы дать мне более подробную информацию об этом? –

1

Вы поставили весь первый раздел регулярных выражений в классе символов (квадратные скобки, все между [ и ] Вам не нужно/хочет характер . класс, как теперь вы только соответствующие по длине (все номера включены в класс полукокса)

Таким образом, вы можете, вероятно, использовать что-то вроде (непроверенные):

^((?:01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33)(?:\d{7}))|(\d{12})$ 

Это должно возвращать все числа из 12 символов (вторая часть) или все числа из 9 символов, начиная с предоставленных последовательностей. Если это то, что вам нужно ...

+0

Но он вернет результат, имеющий 2-значный номер –

0

Просто проверяет первые два символа не то, что я хотел бы использовать регулярные выражения для:

$valid = ['01', '02', '35', '27', '09', '38', ...]; 

if (in_array(substr($str, 0, 2), $valid)) { 
    // continue validation here 
} 
0

Благодаря Kollink, я, наконец, основана модель, которая работала отлично для меня :

^(?:(?:01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33)\d{7}|\d{12})$

0

, поскольку у вас есть все цифры от 01 до 38 в вашем чередовании, вы можете использовать это:

^(?:(?:0[1-9]|[12]\d|3[0-8])\d{7}|\d{12})$ 
Смежные вопросы