$re = '/(?P<group_definition>
\(
(?P<options>[^\:\>\s\(\)]*[\:\>])?
(?P<pattern>
(?:[^\)\(]*(?R)*)*
)
\)
(?P<quantifier>
(?:[\*\+\?])|
(?:
\{(?P<min>\d*)
(?:
,
(?P<max>\d*)?
)?
\}
)
)?
)/imx';
$str = '^(?P<line>(?P<junk>(?!(?:Message\\-ID:)\\s(?:\\<)|(?:<)|(?:\\s))(?!(?:From:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:To:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:Reply\\-To:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:X\\-Sender:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:Return\\-Path:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:Received\\-SPF:))[^\\r\\n]*)(?P<wtf>(?:(?:\\"(?P<display_name>[^\\"\\r\\n]*)\\"\\s*)?\\b(?P<email>(?P<username>[A-Z0-9._%-]+)@(?P<domain_name>(?P<host>(?:[A-Z0-9.-]+\\.)*)?(?P<sld>[A-Z0-9.-]+)\\.(?P<tld>[A-Z]{2,4})))\\b)\\h*)(?P<trailing_data>[^\\r\\n]*))$
(this is a group)?
(another group (with a group inside)) and soem bogus test (and then another group)
(?P<group_definition>
(?P<pattern>
\\(
(?:[^\\)\\(]*(?R)*)*
\\)
)
(?P<quantifier>
(?:[\\*\\+\\?])|
(?:
\\{(?P<min>\\d*)
(?:
,
(?P<max>\\d*)?
)?
\\}
)
)?
)';
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