$re = '/(?:\d+[dD]\d+|\d+\s*[*+-]\s*\d+[dD]\d+)(?:\s*[*+-]\s*(?:\d+[dD]\d+|\d+))*/m';
$str = '1d6
10d6
10d10
3+10d10
1d4+1d6+1d10
1d6+1
1d6 + 1
1d6+ 1
1d6 +1
1d6+3+1d10
1-1d4+2d3*2 * 3
1d4 1d4 // two singly matched groups
1d4 + + - 3 // doesn\'t match crazy
1 // doesn\'t match single numbers
12 34 // doesn\'t match single numbers
1+3+3-1 // doesn\'t match math expressions with no dice';
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