$re = '/<(?\'State\'Idle|Run|Hold|Home|Alarm|Check|Door)(?:,MPos:(?\'MX\'[0-9\.]*),(?\'MY\'[0-9\.]*),(?\'MZ\'[0-9\.]*))?(?:,WPos:(?\'WX\'[0-9\.]*),(?\'WY\'[0-9\.]*),(?\'WZ\'[0-9\.]*))?(?:,Buf:(?\'Buf\'[0-9]*))?(?:,RX:(?\'RX\'[0-9]*))?(?:,Ln:(?\'L\'[0-9]*))?(?:,F:(?\'F\'[0-9\.]*))?(?:,Lim:(?\'Lim\'[0-1]*))?(?:,Ctl:(?\'Ctl\'[0-1]*))?>/';
$str = '<Idle,MPos:0.000,0.000,0.000,WPos:0.000,0.000,0.000,Buf:8,Ln:49,Lim:1001>
<Run,MPos:4.028,0.000,0.000,WPos:4.028,0.000,0.000,RX:25,F:34.4>';
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