Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP regex for any digits followed by specific characters afterwards

Tags:

regex

php

I'm looking to validate a string that has any number of digits followed by a specific character, for example:

"1w 3d 5h 3m" and "32d 5h 3m"

I'm using the following regex at the moment: /\d+[wdhm]\z/ but this is not working if a string contains a letter that I don't want, for example:

"3pp 2h 35m" and "2d 5qq 3m"

The only allowed letters in the string can be "w", "d", "h" and "m" and must be in that order if once is present, for example "2d 35m" is acceptable but "3h 1w" is not because it's in the wrong order.

like image 751
Tom Hartley Avatar asked Jan 30 '26 16:01

Tom Hartley


1 Answers

You may use this regex with multiple optional matches and a lookahead:

^(?=\d)(?:\d+w\h*)?(?:\d+d\h*)?(?:\d+h\h*)?(?:\d+m)?$

RegEx Demo

RegEx Details:

  • ^: Start
  • (?=\d): Lookahead to assert presence of a digit to disallow empty matches
  • (?:\d+w\h*)?: Match 1+ digits followed by w and 0+ whitespaces
  • (?:\d+d\h*)?: Match 1+ digits followed by d and 0+ whitespaces
  • (?:\d+h\h*)?: Match 1+ digits followed by h and 0+ whitespaces
  • (?:\d+m)?: Match 1+ digits followed by m
  • $: End

If you don't want to allow zero spacing between components then use:

^(?=\d)(?:\d+w\h*)?(?:\b\d+d\h*)?(?:\b\d+h\h*)?(?:\b\d+m)?$

RegEx Demo 2

If you want to allow only single spacing then use:

^(?=\d)(?:\d+w\h)?(?:\b\d+d\h)?(?:\b\d+h\h)?(?:\b\d+m)?$

RegEx Demo 3

like image 197
anubhava Avatar answered Feb 01 '26 06:02

anubhava



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!