$re = '/(?:\n+|\A)?
(?<code_all>
(?<code_start>
[ ]{0,3}
\`{3,}
)
\n+
(?<code_content>.*?)
\n+
(?<!`)
\g{code_start}
(?!`)
[ \t]*
\n
)
(?<code_trailing_new_line>\n|\Z)/mxs';
$str = '```
<p>```
~~~
<p>```
```
';
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