web-dev-qa-db-fra.com

Extraire le sous-domaine et l'adresse relative d'une url

J'écris un plugin dans lequel j'ai besoin de scinder une URL soumise à un formulaire en tous les composants, y compris le sous-domaine, l'extension, etc. De plus, je dois construire l'adresse relative de l'URL soumise.

Je connais la fonction Wordpress

wp_parse_url()

mais comme indiqué dans la documentation pour les développeurs, si je soumets l'URL https://developer.wordpress.org/reference/functions/wp_parse_url/ je ne reçois que certaines des informations dont j'ai besoin, à savoir:

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

La fonction intégrée PHP:

parse_url()

n'offre rien de plus. Est-ce que quelqu'un connait une autre fonction ou un autre algorithme qui me permettrait d'extraire tout de l'URL, y compris le sous-domaine, l'extension, etc. en même temps?

1
WPDavid

J'ai rencontré une exigence similaire et je ne pouvais pas trouver une solution toute prête pour cela. J'ai donc créé une fonction basée sur la fonction standard PHP parse_url () et y ai ajouté au fil du temps pour extraire tout Je pourrais penser à.

Ci-dessous, mon code et deux exemples de sortie. Cela va extraire le sous-domaine, domaine racine, tld, extension, chemin, adresse absolue et plus:

/**
 * 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;
    }
}

Exemple 1: si vous envoyez votre exemple d’URL ( https://developer.wordpress.org/reference/functions/wp_parse_url/ ), le résultat sera le suivant:

  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/',
  )

Exemple 2: Une autre URL fictive contenant d'autres éléments http://dev.yoursite.com/some/other/directory/index.php?pg=7 - la sortie sera maintenant:

  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',
  )

Probablement plus d’informations que vous le souhaitez et certaines informations sont redondantes, mais vous pouvez modifier légèrement la fonction pour obtenir exactement ce dont vous avez besoin ou vous pouvez l’utiliser telle quelle et utiliser les parties du tableau dont vous avez besoin.

Remarque: si vous soumettez https://developer.wordpress.org au wordpress ou PHP aux fonctions d'analyse d'URL intégrées, 'chemin' ne sera pas défini dans le résultat. La fonction parseURL () définira le chemin sur '/'.

2
Clinton