$re = '/^(?#day)(?>(?<day>[0-9]+)(?:(d$)|(d(?=[0-9]))|(:(?=[0-9]+(:|h)[0-9]+(:|m)[0-9]+))))?(?#dayEnd )(?#hour)(?>(?<hour>[0-9]+)(?:(h$)|(h(?=[0-9]))|(:(?=[0-9]+(:|m)[0-9]+))))?(?#hourEnd )(?#min)(?>(?<min>[0-9]+)(?:(m$)|(m(?=[0-9]))|(:(?=[0-9]))))?(?#minEnd )(?#sec)(?>(?<sec>[0-9]+((\.|\,)[0-9]*)?)(?:s|$))?(?#secEnd )(?#msec)(?>(?<msec>[0-9]+)(?:(ms$|$)))?(?#msec)$/m';
$str = '10s55
10:10s44
10:10s
10:15s
10d99h88m77s66ms
99h88m77.66s
99h88m77.66
99:88:77.66
999999d888888:77,66
10:99:88:77.66
99:88:77,66s
88h55:77
99h
88m
77
77.5
77s
77.66s
77.66s
88m
55ms
10d55ms
100m
3600s
59:59
59m59s99ms
24:59:59.99
1:24:59m59.123
59:59.0
59.0
1d50ms
10:123
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php