$re = '/^[ ]{0,3}
(?<link_all>
(?<!\\\\)\[(?<link_id>.+?)(?<!\\\\)\]
[ \t]*
\:
[ \t]*\n?[ \t]*
(?:
<(?<link_url>[^\>]+)>
|
(?<link_url>\S+)
)
(?:
(?:
[ \t]+
|
[ \t]*\n[ \t]*
)
(?:
(?:
(?<link_title_container>[\'"])
(?<link_title>.+?)
\g{link_title_container}
)
|
\((?<link_title>[^\)]+)\)
)
)?
[ \t]*
(?<!\\\\)
\{
[[:blank:]\h]*
(?<link_attr>.+?)
[[:blank:]\h]*
\}
[ \t]*
)
(?:\n+|\Z)/mxJ';
$str = '[refid]: /path/to/something (Title) { .class #ref data-key=val }
';
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