web-dev-qa-db-de.com

Subdomain und relative Adresse aus einer URL extrahieren

Ich schreibe ein Plugin, in dem ich eine an ein Formular übermittelte URL in alle Bestandteile der URL aufteilen muss, einschließlich Unterdomäne, Erweiterung usw. Außerdem muss ich die relative Adresse für die übermittelte URL erstellen.

Ich kenne die Wordpress-Funktion

wp_parse_url()

wenn ich jedoch gemäß dem Beispiel in der Entwicklerdokumentation die URL https://developer.wordpress.org/reference/functions/wp_parse_url/ sende, erhalte ich nur einige der Informationen, die ich benötige, nämlich:

array (
  'scheme' => 'https',
  'Host' => 'developer.wordpress.org',
  'path' => '/reference/functions/wp_parse_url/',
)

Die eingebaute Funktion PHP:

parse_url()

bietet nichts mehr an. Kennt jemand eine andere Funktion oder einen anderen Algorithmus, mit dem ich alles auf einmal aus der URL extrahieren kann, einschließlich der Unterdomäne, der Erweiterung usw.?

1
WPDavid

Ich bin auf eine ähnliche Anforderung gestoßen und konnte keine fertige Lösung dafür finden. Deshalb habe ich eine Funktion erstellt, die auf der Standardfunktion PHP parse_url () basiert, und im Laufe der Zeit hinzugefügt, um alles zu extrahieren Ich könnte denken.

Unten ist mein Code und zwei Beispiele für die Ausgabe. Dies extrahiert die Sub-Domain, Root-Domain, tld, Erweiterung, Pfad, absolute Adresse und mehr:

/**
 * Parse and check the URL Sets the following array parameters
 * scheme, Host, port, user, pass, path, query, fragment, dirname, basename, filename, extension, domain, 
 * domainX, absolute address
 * @param string $url of the site
 * @param string $retdata if true then return the parsed URL data otherwise set the $urldata class variable
 * @return array|mixed|boolean
 */
function parseURL($url,$retdata=true){
    $url = substr($url,0,4)=='http'? $url: 'http://'.$url; //assume http if not supplied
    if ($urldata = parse_url(str_replace('&','&',$url))){
        $path_parts = pathinfo($urldata['Host']);
        $tmp = explode('.',$urldata['Host']); $n = count($tmp);
        if ($n>=2){
            if ($n==4 || ($n==3 && strlen($tmp[($n-2)])<=3)){
                $urldata['domain'] = $tmp[($n-3)].".".$tmp[($n-2)].".".$tmp[($n-1)];
                $urldata['tld'] = $tmp[($n-2)].".".$tmp[($n-1)]; //top-level domain
                $urldata['root'] = $tmp[($n-3)]; //second-level domain
                $urldata['subdomain'] = $n==4? $tmp[0]: ($n==3 && strlen($tmp[($n-2)])<=3)? $tmp[0]: '';
            } else {
                $urldata['domain'] = $tmp[($n-2)].".".$tmp[($n-1)];
                $urldata['tld'] = $tmp[($n-1)];
                $urldata['root'] = $tmp[($n-2)];
                $urldata['subdomain'] = $n==3? $tmp[0]: '';
            }
        }
        //$urldata['dirname'] = $path_parts['dirname'];
        $urldata['basename'] = $path_parts['basename'];
        $urldata['filename'] = $path_parts['filename'];
        $urldata['extension'] = $path_parts['extension'];
        $urldata['base'] = $urldata['scheme']."://".$urldata['Host'];
        $urldata['abs'] = (isset($urldata['path']) && strlen($urldata['path']))? $urldata['path']: '/';
        $urldata['abs'] .= (isset($urldata['query']) && strlen($urldata['query']))? '?'.$urldata['query']: '';
        //Set data
        if ($retdata){
            return $urldata;
        } else {
            $this->urldata = $urldata;
            return true;
        }
    } else {
        //invalid URL
        return false;
    }
}

Beispiel 1: Wenn Sie Ihre Beispiel-URL ( https://developer.wordpress.org/reference/functions/wp_parse_url/ ) übermitteln, sieht die Ausgabe folgendermaßen aus:

  array (
    'scheme' => 'https',
    'Host' => 'developer.wordpress.org',
    'path' => '/reference/functions/wp_parse_url/',
    'domain' => 'wordpress.org',
    'tld' => 'org',
    'root' => 'wordpress',
    'subdomain' => 'developer',
    'basename' => 'developer.wordpress.org',
    'filename' => 'developer.wordpress',
    'extension' => 'org',
    'base' => 'https://developer.wordpress.org',
    'abs' => '/reference/functions/wp_parse_url/',
  )

Beispiel 2: Eine andere fiktive URL mit weiteren Inhalten http://dev.yoursite.com/some/other/directory/index.php?pg=7 - Die Ausgabe lautet jetzt:

  array (
    'scheme' => 'http',
    'Host' => 'dev.yoursite.com',
    'path' => '/some/other/directory/index.php',
    'query' => 'pg=7',
    'domain' => 'yoursite.com',
    'tld' => 'com',
    'root' => 'yoursite',
    'subdomain' => 'dev',
    'basename' => 'dev.yoursite.com',
    'filename' => 'dev.yoursite',
    'extension' => 'com',
    'base' => 'http://dev.yoursite.com',
    'abs' => '/some/other/directory/index.php?pg=7',
  )

Wahrscheinlich mehr Informationen als Sie möchten und einige der Informationen sind redundant, aber Sie können die Funktion leicht ändern, um genau das zu erhalten, was Sie benötigen, oder Sie können sie unverändert verwenden und die Teile des Arrays verwenden, die Sie benötigen.

Hinweis: Wenn Sie https://developer.wordpress.org an WordPress oder PHP integrierte URL-Analysefunktionen senden, wird 'path' in der Ausgabe nicht definiert. Die Funktion parseURL () setzt den Pfad auf '/'.

2
Clinton