HTML-ből kiszedett url-eket dolgoztam volna fel, de a PHP beépített parse_url() függvénye egy warning kíséretében elszáll, ha relatív url-eket adunk meg.
Szintén nem tetszenek neki az olyan URI-k, mint pl. a mailto: vagy ftp://
Írtam egy függvényt, ami úgy dolgozza fel az URL-eket és URI-kat, hogy
- soha nem száll el warning-al
- jól kezeli a relatív URL-eket
- teljes értékű helyettesítője a php parse_url()-nek
Itt a kód, illetve a post végén egy linken le is tölthető. Bárki bármilyen hibát talál, jelezze a hozzászólásoknál, hogy javíthassam.
<?php
function parse_url_relative($url, $component = NULL){
$full_rx = '!^
(?P<scheme>[a-z][a-z0-9\+\-\.]*):/* # scheme
(?:(?P<user>[^:@]*)(?::(?P<pass>[^@]*))?@)? # user and password
(?P<host>[^/\?\#:]*) # host
(?::(?P<port>[0-9]+))? # port
(?P<path>[^\?\#]*) # path
(?:\?(?P<query>[^\#]*))? # query
(?:\#(?P<fragment>.*))? # fragment
$!ix';
$path_rx = '!^
(?P<path>[^\?\#]*) # path
(?:\?(?P<query>[^\#]*))? # query
(?:\#(?P<fragment>.*))? # fragment
$!ix';
if (!preg_match($full_rx, $url, $m)) {
preg_match($path_rx, $url, $m);
}
$return = array(
'scheme' => isset($m['scheme']) ? $m['scheme'] : NULL,
'user' => isset($m['user']) ? $m['user'] : NULL,
'pass' => isset($m['pass']) ? $m['pass'] : NULL,
'host' => isset($m['host']) ? $m['host'] : NULL,
'port' => isset($m['port']) ? $m['port'] : NULL,
'path' => isset($m['path']) ? $m['path'] : '',
'query' => isset($m['query']) ? $m['query'] : '',
'fragment' => isset($m['fragment']) ? $m['fragment'] : '',
);
switch ($component) {
case NULL:
return $return;
case PHP_URL_SCHEME:
return $return['scheme'];
case PHP_URL_HOST:
return $return['host'];
case PHP_URL_PORT:
return $return['port'];
case PHP_URL_USER:
return $return['user'];
case PHP_URL_PASS:
return $return['pass'];
case PHP_URL_PATH:
return $return['path'];
case PHP_URL_QUERY:
return $return['query'];
case PHP_URL_FRAGMENT:
return $return['fragment'];
}
}
?>
Csatolmány | Méret |
---|---|
parse_url_relative.php | 2.55 KB |