Another shot at trying to find a better parser. I noticed that the laulibrius/theoriginalmarksimpson functions didn't quite handle the URL for the page they were displayed on. For my mirror, ca3, this is
http://ca3.php.net/manual/en/function.parse-url.php
Run it through the function and it parses to
scheme => http
login =>
pass =>
host => ca3.php.net
ip =>
subdomain => ca3
domain => php.
extension => net
port =>
path => /manual/en/function.parse
file => function.parse
that is, the file name gets a bit mangled
Rather than tweak the function's regular expression yet again, I opted to adapt a RegExp that served me well in Javascript:
function j_parseUrl($url) {
$r = "(?:([a-z0-9+-._]+)://)?";
$r .= "(?:";
$r .= "(?:((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9a-f]{2})*)@)?";
$r .= "((?:[a-z0-9-._~!$&'()*+,;=]|%[0-9a-f]{2})*)";
$r .= "(?::(\d*))?";
$r .= "(/(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9a-f]{2})*)?";
$r .= "|";
$r .= "(/?";
$r .= "(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+";
$r .= "(?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9a-f]{2})*";
$r .= ")?";
$r .= ")";
$r .= "(?:\?((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9a-f]{2})*))?";
$r .= "(?:#((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9a-f]{2})*))?";
preg_match("`$r`i", $url, $match);
$parts = array(
"scheme"=>'',
"userinfo"=>'',
"authority"=>'',
"host"=> '',
"port"=>'',
"path"=>'',
"query"=>'',
"fragment"=>'');
switch (count ($match)) {
case 9: $parts['fragment'] = $match[8];
case 8: $parts['query'] = $match[7];
case 7: $parts['path'] = $match[6];
case 6: $parts['path'] = $match[5] . $parts['path'];
case 5: $parts['port'] = $match[4];
case 4: $parts['host'] = $match[3];
case 3: $parts['userinfo'] = $match[2];
case 2: $parts['scheme'] = $match[1];
}
$parts['authority'] = ($parts['userinfo']?$parts['userinfo']."@":"").
$parts['host'].
($parts['port']?":".$parts['port']:"");
return $parts;
}
This function, when fed "http://ca3.php.net/manual/en/function.parse-url.php", returns
scheme => http
userinfo =>
authority => ca3.php.net
host => ca3.php.net
port =>
path => /manual/en/function.parse-url.php
query =>
fragment =>
which is somewhat closer to my needs.
But everything should be tested against the two examples provided by RFC3986,
/* line too long for this site's commnet handler */
"foo://username:[email protected]:8042".
"/over/there/index.dtb;type=animal?name=ferret#nose"
and
"urn:example:animal:ferret:nose"
Here the native function parse_url() performs admirably on that "urn:" example. Mine fails to pick out the path ("example:animal:ferret:nose") and the laulibrius/theoriginalmarksimpson function can't decipher anything there. On the "foo:" example, both my function and parse_url() get it right, while the other examples on this page don't.
The laulibrius/theoriginalmarksimpson function delivers
scheme => foo
login => username
pass => password
host => example.com
ip =>
subdomain =>
domain => example.
extension => com
port => 8042
path => /over/there/index.dtb
file => index.dtb
As you can see, the query string ("name=ferret") and fragment ("nose") have dropped off, as well as the parameter ("type=animal").
----
Server IP: 216.235.15.211
Probable Submitter: 24.83.221.115
----
Manual Page -- http://www.php.net/manual/en/function.parse-url.php
Edit -- https://master.php.net/note/edit/86115
Del: integrated -- https://master.php.net/note/delete/86115/integrated
Del: useless -- https://master.php.net/note/delete/86115/useless
Del: bad code -- https://master.php.net/note/delete/86115/bad+code
Del: spam -- https://master.php.net/note/delete/86115/spam
Del: non-english -- https://master.php.net/note/delete/86115/non-english
Del: in docs -- https://master.php.net/note/delete/86115/in+docs
Del: other reasons-- https://master.php.net/note/delete/86115
Reject -- https://master.php.net/note/reject/86115
Search -- https://master.php.net/manage/user-notes.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.