$re = '/MUST\s+(?:\(([^()]+)\)|(\S+))\s*(?:MAY)?/m';
$str = '( class1-OID NAME \'class1\' SUP top STRUCTURAL MUST description MAY ( brand $ details $ role ) )
( class2-OID NAME \'class2\' SUP top STRUCTURAL MUST groupname MAY description )
( class3-OID NAME \'class3\' SUP top STRUCTURAL MUST ( code $ name ) )
( class4-OID NAME \'class4\' SUP top STRUCTURAL MUST ( code $ name ) MAY ( group $ description ) )
';
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