$re = '/<!ELEMENT\s+
((?\'elname\'\S+)\s+)
((?\'rank\'\d+)\s+)?
(?\'tagOmit\'
(?\'start\'[-oO])\s+
(?\'end\'[-oO])\s+
)?
(?\'content\'
(?\'keyword\'(ANY|EMPTY|CDATA|RDATA))|
(?\'contentGrp\' \(.*\)[*+?]?)
)
(?\'exceptions\'
(\s+\-(?\'exclusion\'\(.+\)))?
(\s+\+(?\'inclusion\'\(.+\)))?
)
\s*>/mx';
$str = '<!ELEMENT FTNOTE - - ((PARA | PARA-EFF-GROUP | PARA-EFF-CHOICE | TABLE | UN-LIST | NOTE | TABLE-EFF-GROUP | TABLE-EFF-CHOICE)+)
-(FTNOTE | NOTE | TABLE | GROUND-TEST | CORRECTIVE-ACTION)>
<!ELEMENT ENTRY - - (WARNING | CAUTION | NOTE | (PARA | UN-LIST | PARA-EFF-GROUP | PARA-EFF-CHOICE)*)
-(ENTRY | GRAPHIC-COLLECTION)
+(INFOMARK | FTNOTE-REF)>
<!ELEMENT COLSPEC - o EMPTY>
<!ELEMENT TGROUP - - (COLSPEC+, THEAD?, TBODY)>
<!ELEMENT TABLE - - (TITLE?, TGROUP, FTNOTE*)
-(TABLE | TABLE-NO-TITLE | GROUND-TEST | CORRECTIVE-ACTION)
+(INFOMARK | INCLUDED-SUBDOC | INCLUDED-SOURCE-DATA | EFF-NONE)>';
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