- preg_match: documentation ( source)
- print_r: documentation ( source)
<?php
$pattern = <<<REGEXP
!
^
(?P<scheme> [a-z][a-z0-9+.\-]* ) [:] # scheme is mandatory, and followed by a :
(?: [/][/] # // indicates that this component is the authority
(?:
(?P<user> [^:@/]+ )
(?: [:] (?P<pass> [^:@/]+ ) )?
[@]
)? # auth details are optional
(?P<host> [^:/]* ) # host is mandatory. Technically it should be at least 1 char, but PHP has
# internal schemes that violate this rule and as much as I dislike it, I
# feel that we should pass this
(?: [:] (?P<port> [0-9]+ ) )? # port is simply a sequence of decimal digits
(?= [/?#]|$ ) # path must be missing or begin with / if authority is present
)?
(?P<path> [^?#]+ )? # path is everything up to the query/fragment
(?: [?] (?P<query> [^#]+ )? # query is optional
(?: [#] (?P<fragment> .+ )? # fragment is optional
$
!xi
REGEXP;
$url = 'http://foo.com/test?thing=stuff#fragment';
preg_match($pattern, $url, $matches);
print_r($matches);