tags:

views:

135

answers:

1

I am attempting (and failing) to write a PHP regex that will match a Windows product key in the form XXXXX-XXXXX-XXXXX-XXXXX-XXXXX (where X is an uppercase letter or a number).

I have come up with the following, but it is not doing quite what I expect (provided it actually can do what I expect!). I consider myself pretty well versed in PHP, but regexes are a particular weak point for me.

([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})

What I am actually after is it to pass ABCDE-FGHIJ-KLMNO-PQRST-UVWXY but to fail ABCDE-FGHIJ-KLMNO-PQRST-UVWXYZ (notice the last block has 6 characters).

Bonus chatter: Yes, I know that not all letters are valid in a Windows product key, but the important bit is that it validates the text has been entered in the correct format.

+6  A: 

All you're missing is position anchors in your regex. Currently, the regex will match that pattern anywhere in a string. The string could by "my product key is XXXXX-XXXXX-XXXXX-XXXXX-XXXXX and my name is Bob" and your regex would match. What you need is

^([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})-([A-Z1-9]{5})$

The ^ matches only the beginning of the string and $ matches only the end.

Emily
You can shorten it to `^[A-Z1-9]{5}(-[A-Z1-9]{5}){4}$`, though.
Joey
I don't actually use PHP so I wasn't sure if that would allow getting all the match groups or just the last one.
Emily
Well, the question didn't sound like they'd be using the groups; looked more like validation to me. But yes, if you need the groups, then it isn't going to work in the shortened form.
Joey
Ah is that really all it was! @Johannes Rössel - I'll give that a shot too. Thanks to both of you.
Ben