2014-02-20 3 views
0

Я пишу приложение на PHP, которому нужно проверить поле для правильного кода ваучера. Запись ваучера может быть в одном из трех шаблонов. Я не очень хорош в выражениях, поэтому надеялся на небольшую помощь от некоторых экспертов здесь.preg_match для нескольких шаблонов

Эти три модели являются: 1000150000 (любые 10 цифр) 12345678 (любые 8 цифр) 3JFK-TAB-CDEFG (первое пятно номер, альфа отдыха с или без дефиса.)

I» м, поскольку три записи ваучера настолько различны, что, возможно, придется выполнять в трех разных операторах IF.

Спасибо за любую помощь! Rick

+0

Я не Regex эксперт, но я предположил бы, что один большой Regex, который охватывает 3 картины бы сделать то же самое, как с 3-разному валидация. С учетом сказанного я лично разделился бы на 3 разных валидации для лучшей читаемости и модульности кода. –

ответ

4

Вы можете сделать это:

(^\d{10}$|^\d{8}$|^\d[A-Za-z-]+$) 

Работа регулярок пример:

http://regex101.com/r/uI9dU0

+0

Итак, что-то вроде: if (! Preg_match ("^ \ d {10} $ |^\ d {8} $ |^\ d [A-Za-z -] + $", $ ваучер)) {echo " НЕ СОВПАДАЕТ"; }? – Rick

+0

@ Рик, да точно. Вот и все. :) – MElliott

+0

Еще один вопрос. Похоже, что третий матч в приведенном выше примере будет работать с любой длиной. Как изменить его, чтобы соответствовать только 12 или 14 символам? 14 с дефисами или 12 без. – Rick

-1

Или вы могли бы использовать чередование. То есть, напишите три регулярных выражения и соедините их вместе с | Знак означает «Сопоставьте одно из этого».

Так

/[^...$]|\d|Z$/ 

(т.е. три символа или содержит номер или заканчивается с Z.)

0

(\d{10})?(\d{8})?(\d[a-zA-Z-]+)?

Это создает три дополнительных групп, 1-3, что будет захватить любой 10 цифры (группа 1), любые 8 цифр (группа 2) или число, за которым следуют альфа-символы, с дефисом или без них (группа 3).

Ссылка на the expression на regex101.

+0

Думаю, вы захотите добавить начало и конец строковых утверждений ('^' и '$'). иначе 'hello1000150000' на самом деле будет соответствовать. – MElliott

+1

Я не согласен, но неясно, что это такое, поэтому я оставил это с мыслью, что при необходимости он может быть ограничен. – binarysubstrate

+0

Прохладный. Просто подумал, что я бы сказал. :) – MElliott

0

Вы можете использовать это:

/^[0-9](?:[0-9]{7}(?:[0-9]{2})?|[A-Z]*(?>-[A-Z]+)*)$/ 

Основные интересы этой модели являются:

  • избежать строки, как это: 9ABCD-EFGH- (что finishs с дефисом)
  • , чтобы не повторяет все цифры, делая 2 последние цифры необязательно. (вместо чередования)
  • , чтобы попытаться совместить первую цифру только один раз. (шаблон не может немедленно, если первый символ не цифра.)
+0

Это слишком сложно. Производительность не является законной проблемой, и нет другой причины предпочитать это по простому чередованию, предложенному [MElliott] (http://stackoverflow.com/a/21920046/20938). (Возможно, часть без каких-либо конечных дефиса действительна, но это требование не упоминалось в вопросе.) Кроме того, ваши скобки не сбалансированы. –

+0

@AlanMoore: Спасибо, что несбалансированная группа. «слишком сложный» - это всего лишь воображение ума. Довольный тем, что вы отмечаете, что строки, подобные «1 ------------------ AAAAAAAAAAAAAA ----------», не допускаются. –

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