Ian
Ian

Reputation: 900

Regular expression for matching valid prices in PHP

I am using the following regex:

^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$

I use this regex to check for valid prices : it catches/rejects things like xxx, or llddd, or 34.23dsds and allows things like 100 or 120.00

The problem with it seems to be if it is blank (empty) it passes as valid which it should not.

Upvotes: 1

Views: 47

Answers (2)

Will Barnwell
Will Barnwell

Reputation: 4089

Taking yoiur regex and just solving the "don't match blanks" problem:

^[0-9.,]+(([.,][-])|([.,][0-9]{2}))?$

the * allows 0 or more, while the + allows 1 or more, thus the * allowed blanks but the + will not, instead there must be at least one digit.

EDIT:

You should clean this regex up a bit to be

^[0-9]+(?:[.,-](?:[0-9]{2})?)?$

This solves the matching of ",,,"

http://www.regextester.com/?fam=95185

EDIT 2: @Fuzzzzel pointed out that this did not match the case "50,-" which we assume you would like to match and that removing capturing groups is presumptive. Here's the latest iteration of my suggested regex:

^[0-9]+([.,-](-|([0-9]{2}))?)?$

Upvotes: 1

Fuzzzzel
Fuzzzzel

Reputation: 1773

One of your problems is that you use the dot in your regex which stands for "any character". If you mean a dot you need to escape it like this \.

Also you should have at least one number in it so exchange the asterisk * by a + for "one or more".

Then you can have .,.,.,.,.,.,- if you do not remove the comma and dot from the first part:

^[0-9]+(([\.,][-])|([\.,][0-9]{2}))?$

Upvotes: 1

Related Questions