$re = '/<!ATTLIST\s*
(?\'elname\'\S+)\s*
(?\'attr\'
(?\'attrName\'[-_A-Za-z0-9]+)
\s+
(?\'declVal\'
(?\'attrEnum\'\([\s\-_|A-Za-z0-9]+\)) |
(?\'attrType\'[-_A-Za-z0-9]+)
)
(?\'default\'\s+
(?\'defType\'(\#[A-Z]+))?\s*
(?\'defVal\'[\'""][-_A-Za-z0-9]+[\'""][\s*>])?
)?\s*
)+
>/mx';
$str = '<!ATTLIST ELNAME
CHOICETYPE (MUTUALLY-EXCLUSIVE | NONEXCLUSIVE) #IMPLIED
EMODARCH NAME #FIXED "EFFECTIVITY-CHOICE"
RULESPEC NAME #IMPLIED
RULESPEC-SUPPL NUMBER #IMPLIED
EID NAME #REQUIRED
DTD-VERSION CDATA #FIXED \'2016-04-05-BETA-DRAFT1\'
BID NAME #IMPLIED>';
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