$re = '/^(?>(?\'protocol\'[a-zA-Z]+)://)?(?\'domain\'[a-zA-Z0-9.\-_]*)?(?>:(?\'port\'\d{1,5}))?/(?\'path\'[a-zA-Z0-9_\-%]+)(?:(?>\?(?\'query\'[a-zA-Z0-9_\-=&%]+))()|(?>#(?\'anchor\'[a-zA-Z0-9_\-%]+))()){0,2}$/m';
$str = 'https://localhost:5000/test?id=10&class=5#header
http://example.com:443/test#header
ws://example.com/test?id=10&class=5
/test?id=10&class=5
/test?t=10
/test#10
/test%20test
/test#10?data=test';
$subst = "protocol: ${protocol}\nhost name: ${domain}\nport: ${port}\npath: /${path}\nquery: ${query}\nanchor: ${anchor}\n";
$result = preg_replace($re, $subst, $str);
echo "The result of the substitution is ".$result;
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