$re = '/^\$cdt\[([a-zA-Z_][a-zA-Z0-9_]{3,100}),([a-zA-Z0-9_+\-*/%&|^!=<>\[\]$ ]{1,500}),([a-zA-Z0-9_+\-*/%&|^!=<>\[\]$ ]{1,500}),?([a-zA-Z0-9_\- ]{1,100}=[a-zA-Z0-9_+\-*/%&|^!=<>\[\]$ ]{1,500}(?:;[a-zA-Z0-9_\- ]{1,100}=[a-zA-Z0-9_+\-*/%&|^!=<>\[\]$ ]{1,500})*)?]$/m';
$str = '$cdt[cdt1,$[col1]-4==1,$[col2]+$[col3],var1=1;var2=2+1;var3=6==6]
$cdt[cdt1,$[col1]-4==1,$[col2]+$[col3]]';
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