$re = '/(?x)
(?(DEFINE)
(?<nrun> [0-9]+)
(?<range> (?&nrun) (-(?&nrun))? )
(?<sep> ,)
)
^( (?&range) ((?&sep)|$) )+$/m';
$str = '^((^|,)([0-9]+(-[0-9]+)?(,|$))+)$
1,2,3-5,6
1,2,3-5,6,
1
1-3
,1,2,3
23,25-89,99
23,12,3-5,15
1,2,3-,4,5-7
1,2,3-,4,5-7,
1,2,-3,4,5
1,2,-,3,4
1,2,,,3,4
1a2-2aoe
abc2-23ght';
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