2016-05-31 1 views
2

Я все еще пытаюсь справиться с шаблонами регулярных выражений и сразу после небольшой проверки, если кто-то не возражает!Regex Preg_match для лицензионного ключа 25 буквенно-цифровых и 4 дефиса

У меня есть строка, которая должна содержать либо:

  • 10 цифр (цифры и буквы) лицензионный ключ, например: 1234567890 ИЛИ
  • A 25 цифр (цифры и буквы) лицензионный ключ, для пример: ABCD1EFGH2IJKL3MNOP4QRST5 ИЛИ
  • Ряд 29 цифр лицензии (25 числа и буквы, разделенных на 5 групп дефисом), например: ABCD1-EFGH2-IJKL3-MNOP4-QRST51

I может соответствовать первым двум штрафам, используя функции ctype_alnum и strlen. Тем не менее, для последнего я думаю, что мне нужно будет использовать регулярное выражение и preg_match.

я был перейти в regex101.com и придумал следующее:

preg_match('^([A-Za-z0-9]{5})+-+([A-Za-z0-9]{5})+-+([A-Za-z0-9]{5})+-([A-Za-z0-9]{5})+-+([A-Za-z0-9]{5})', $str); 

который, кажется, соответствует тому, что я ищу. Я хочу, чтобы строка содержала точное соответствие для строки, начинающейся с номера лицензии, и содержала ничего, кроме смешанных букв и цифр верхнего и нижнего регистра в любом порядке и дефисов между каждой группой из 5 символов (так что в общей сложности 29 персонажи - я не хочу никаких дальнейших матчей). Нет пробелов, других символов и ничего еще до или после 29-значной клавиши.

Будет ли работа выше, без каких-либо других комбинаций? Остановит ли он проверку на 29 символов? Я не уверен, есть ли более простой способ выразить это в regex?

Спасибо за ваше время!

+1

Вы забыли якоря и регулярные выражения разделителей. Кроме того, я считаю, что '+' неуместны, удалите их. Используйте '' ~^[A-Za-z0-9] {5} - [A-Za-z0-9] {5} - [A-Za-z0-9] {5} - [A-Za-z0 -9] {5} - [A-Za-z0-9] {5} $ ~ ''. Или даже '' ~^[A-Za-z0-9] {5} (?: - [A-Za-z0-9] {5}) {4} $ ~ ''. Попробуйте [здесь] (https://regex101.com/r/jC3xV2/3). –

+0

@Wiktor Stribiżew благодарит за быстрый ответ, его очень оценили. Можете ли вы объяснить, что означает сокращенная версия? Я пытаюсь лучше понять регулярное выражение. Значит, мне не нужно постоянно спрашивать о том, что вас беспокоят все! Кроме того, если вы представите это как ответ, я смогу принять его, если он будет работать (когда мой лимит на принятие ответов пройдет!) – BottyZ

+0

* если он работает *, это то, почему я не размещаю это. Это работает? Укороченная версия такая же, как и более длинные, она просто использует ограничивающий квантификатор '{4}', чтобы не повторять шаблон 4 раза. Обратите внимание, что '$' соответствует концу строки. –

ответ

2

Главное, что вам нужно использовать как ^ (начало строки) и $ (конец строки) якорей. Кроме того, когда вы используете + после (...), вы разрешаете 1 или более повторений всего подшаблона внутри (...). Итак, вам нужно удалить + s и добавить якорь $. Кроме того, вам нужны регулярные выражения для регулярного выражения для работы в PHP preg_match. Я предпочитаю ~, чтобы не избежать /. Может быть, это не так, но это привычка.

Таким образом, регулярное выражение может выглядеть

'~^[A-Za-z0-9]{5}(?:-[A-Za-z0-9]{5}){4}$~' 

ВИДЕТЬ regex demo

(?:-[A-Za-z0-9]{5}){4} матчи 4 вхождений -[A-Za-z0-9]{5} подмаски. (?:...) - это группа, не связанная с захватом, согласованный текст которой не сохраняется в любом буфере (в отличие от группы захвата).

Смотрите IDEONE demo:

$re = '~^[A-Za-z0-9]{5}(?:-[A-Za-z0-9]{5}){4}$~'; 
$str = "ABCD1-EFGH2-IJKL3-MNOP4-QRST5"; 
if (preg_match($re, $str, $matches)) { 
    echo "Matched!"; 
} 
+1

Спасибо за подробное объяснение. – BottyZ

1

Как насчет:

preg_match('/^([a-z0-9]{5})(?:-(?1)){4}$/i', $str); 

Объяснение:

/    : regex delimiter 
^   : begining of string 
    (   : begin group 1 
    [a-z0-9]{5} : exactly 5 alphanum. 
)    : end of group 1 
    (?:   : begin NON capture group 
    -   : a dash 
    (?1)  : same as definition in group 1 (ie. [a-z0-9]{5}) 
){4}   : this group must be repeated 4 times 
    $    : end of string 
/i    : regex delimiter with case insensitive modifier 
+0

Привет, спасибо за ответ, я не уверен, что это правильно, поскольку он не работает, когда я запускаю его через свою форму. Однако версия Wiktor в комментариях выше. – BottyZ

+0

@BottyZ: Я забыл модификатор '/ i', теперь он должен работать. – Toto

+0

Да, и все равно это то же самое, что и мое регулярное выражение. :) –

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

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