Comment extraire l'URL de base d'une chaîne en JavaScript?

168

J'essaie de trouver une méthode relativement simple et fiable pour extraire l'URL de base d'une variable de chaîne en utilisant JavaScript (ou jQuery).

Par exemple, étant donné quelque chose comme:

http://www.sitename.com/article/2009/09/14/this-is-an-article/

J'aimerais avoir:

http://www.sitename.com/

Une expression régulière est-elle le meilleur pari? Si tel est le cas, quelle instruction puis-je utiliser pour affecter l'URL de base extraite d'une chaîne donnée à une nouvelle variable?

J'ai fait quelques recherches à ce sujet, mais tout ce que je trouve dans le monde JavaScript semble tourner autour de la collecte de ces informations à partir de l'URL réelle du document en utilisant location.host ou similaire.

Bungle
la source
La réponse de nos jours devrait être celle-ci ci
Davidmpaz

Réponses:

205

Edit: Certains se plaignent que cela ne prend pas en compte le protocole. J'ai donc décidé de mettre à jour le code, car il est marqué comme réponse. Pour ceux qui aiment le code en une ligne ... eh bien, désolé, c'est pourquoi nous utilisons des minimiseurs de code, le code doit être lisible par l'homme et c'est mieux ... à mon avis.

var pathArray = "https://somedomain.com".split( '/' );
var protocol = pathArray[0];
var host = pathArray[2];
var url = protocol + '//' + host;

Ou utilisez la solution de Davids par le bas.

Itzhar
la source
6
Merci pour la réponse, mais encore une fois, j'essaye d'extraire l'URL de base d'une chaîne, plutôt que l'URL réelle du document. Je ne pense pas que cela m'aidera - mais corrigez-moi si je me trompe.
Bungle le
2
pathArray = String (" VotreHost.com/url/nic/or/not").split ('/'); hôte = pathArray [2];
4
Compris - merci Rafal et daddywoodland! J'ai fini par utiliser: url = ' sitename.com/article/2009/09/14/this-is-an-article '; pathArray = (url) .split ('/'); hôte = 'http: //' + pathArray [2]; Je pense que l'exemple de Rafal a simplement omis le "http: //" qui est présent dans toutes les chaînes que je suis en train de traiter, auquel cas le pathArray [2] est celui dont vous avez besoin. Sans le préfixe "http: //", pathArray [0] serait celui-là. Merci encore.
Bungle le
4
Pourquoi toute la déclaration de variable? url = 'sitename.com/article/2009/09/14/this-is-an-article'; newurl = 'http://' + url.split('/')[0];
ErikE
1
pathArray = window.location.href.split ('/'); protocole = pathArray [0]; hôte = pathArray [2]; url = protocole + ': //' + hôte; //now url === "http:://stackoverflow.com" Commander::
154

Les navigateurs WebKit, Firefox à partir de la version 21 et les versions actuelles d'Internet Explorer (IE 10 et 11) sont implémentés location.origin.

location.origininclut le protocole , le domaine et éventuellement le port de l'URL.

Par exemple, location.originde l'URL http://www.sitename.com/article/2009/09/14/this-is-an-article/est http://www.sitename.com.

Pour cibler les navigateurs sans prise en charge, location.originutilisez le polyfill concis suivant:

if (typeof location.origin === 'undefined')
    location.origin = location.protocol + '//' + location.host;
David
la source
36
window.location.hostnamemanquera le numéro de port s'il est donné, alors utilisez window.location.host. Ainsi, le 'nom de base' complet, y compris la barre oblique de fin, serait:window.location.protocol+"//"+window.location.host + "/";
sroebuck
4
En fait, window.location.hostname est toujours utile si, comme dans mon cas, vous devez fournir un numéro de port différent.
Darrell Brogdon
44

Pas besoin d'utiliser jQuery, utilisez simplement

location.hostname
daddywoodland
la source
5
Merci - Je ne peux pas utiliser ça avec une chaîne, n'est-ce pas? Je crois comprendre que cela ne fonctionnera qu'avec l'URL du document.
Bungle le
2
Cela n'inclura pas le protocole et le port.
David
32

Il n'y a aucune raison de faire des fractionnements pour obtenir le chemin, le nom d'hôte, etc. d'une chaîne qui est un lien. Il vous suffit d'utiliser un lien

//create a new element link with your link
var a = document.createElement("a");
a.href="http://www.sitename.com/article/2009/09/14/this-is-an-article/";

//hide it from view when it is added
a.style.display="none";

//add it
document.body.appendChild(a);

//read the links "features"
alert(a.protocol);
alert(a.hostname)
alert(a.pathname)
alert(a.port);
alert(a.hash);

//remove it
document.body.removeChild(a);

Vous pouvez facilement le faire avec jQuery en ajoutant l'élément et en lisant son attr.

epascarello
la source
6
Pourquoi ajouter 50K de jQuery alors que vous avez montré comment le faire sans jQuery en quelques octets?
Tim Down le
13
Parce que l'affiche dit qu'ils utilisent jQuery.
epascarello le
1
Ah oui, c'est juste. Bien que quand c'est aussi simple que cela, je ne vois aucune valeur à utiliser la couche supplémentaire d'abstraction que l'utilisation de jQuery ajouterait.
Tim Down
2
Nous supposons que tout le site fonctionne sur jqUERY dans ce cas, kquery simplifierait en effet les choses.
trusktr
2
Ewww ... ce n'est pas la meilleure façon de faire cela ... Si vous procédez à une extraction depuis window.location.href, utilisez window.location. Sinon, utilisez une regex.
BMiner
21
var host = location.protocol + '//' + location.host + '/';
kta
la source
2
Cela devrait être considéré comme la bonne réponse - il conserve le protocole
Katai
16
String.prototype.url = function() {
  const a = $('<a />').attr('href', this)[0];
  // or if you are not using jQuery 👇🏻
  // const a = document.createElement('a'); a.setAttribute('href', this);
  let origin = a.protocol + '//' + a.hostname;
  if (a.port.length > 0) {
    origin = `${origin}:${a.port}`;
  }
  const {host, hostname, pathname, port, protocol, search, hash} = a;
  return {origin, host, hostname, pathname, port, protocol, search, hash};

}

Ensuite :

'http://mysite:5050/pke45#23'.url()
 //OUTPUT : {host: "mysite:5050", hostname: "mysite", pathname: "/pke45", port: "5050", protocol: "http:",hash:"#23",origin:"http://mysite:5050"}

Pour votre demande, vous avez besoin de:

 'http://mysite:5050/pke45#23'.url().origin

Révision 07-2017: Il peut également être plus élégant et a plus de fonctionnalités

const parseUrl = (string, prop) =>  {
  const a = document.createElement('a'); 
  a.setAttribute('href', string);
  const {host, hostname, pathname, port, protocol, search, hash} = a;
  const origin = `${protocol}//${hostname}${port.length ? `:${port}`:''}`;
  return prop ? eval(prop) : {origin, host, hostname, pathname, port, protocol, search, hash}
}

ensuite

parseUrl('http://mysite:5050/pke45#23')
// {origin: "http://mysite:5050", host: "mysite:5050", hostname: "mysite", pathname: "/pke45", port: "5050"…}


parseUrl('http://mysite:5050/pke45#23', 'origin')
// "http://mysite:5050"

Cool!

Abdennour TOUMI
la source
12

Si vous utilisez jQuery, c'est un moyen plutôt sympa de manipuler des éléments en javascript sans les ajouter au DOM:

var myAnchor = $("<a />");

//set href    
myAnchor.attr('href', 'http://example.com/path/to/myfile')

//your link's features
var hostname = myAnchor.attr('hostname'); // http://example.com
var pathname = myAnchor.attr('pathname'); // /path/to/my/file
//...etc
Wayne
la source
1
Je pense que ça devrait l'être myAnchor.prop('hostname'). Je suppose que jQuery a changé au cours des 5 dernières années ... Merci pour la réponse!
Dehli
11

Une approche légère mais complète pour obtenir des valeurs de base à partir d'une représentation sous forme de chaîne d'une URL est la règle d'expression régulière de Douglas Crockford:

var yourUrl = "http://www.sitename.com/article/2009/09/14/this-is-an-article/";
var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var parts = parse_url.exec( yourUrl );
var result = parts[1]+':'+parts[2]+parts[3]+'/' ;

Si vous êtes à la recherche d'une boîte à outils de manipulation d'URL plus puissants try URI.js Il prend en charge getter, setter, url normalisation etc tous avec une belle api chainable.

Si vous recherchez un plugin jQuery, alors jquery.url.js devrait vous aider

Une façon plus simple de le faire est d'utiliser un élément d'ancrage, comme @epascarello l'a suggéré. Cela présente l'inconvénient de devoir créer un élément DOM. Cependant, cela peut être mis en cache dans une fermeture et réutilisé pour plusieurs URL:

var parseUrl = (function () {
  var a = document.createElement('a');
  return function (url) {
    a.href = url;
    return {
      host: a.host,
      hostname: a.hostname,
      pathname: a.pathname,
      port: a.port,
      protocol: a.protocol,
      search: a.search,
      hash: a.hash
    };
  }
})();

Utilisez-le comme ceci:

paserUrl('http://google.com');
alexandru.topliceanu
la source
10

Eh bien, l' objet API URL évite de diviser et de construire manuellement les URL.

 let url = new URL('/programming/1420881');
 alert(url.origin);
devansvd
la source
8

Si vous extrayez des informations de window.location.href (la barre d'adresse), utilisez ce code pour obtenir http://www.sitename.com/:

var loc = location;
var url = loc.protocol + "//" + loc.host + "/";

Si vous avez une chaîne,, strc'est une URL arbitraire (et non window.location.href), utilisez des expressions régulières:

var url = str.match(/^(([a-z]+:)?(\/\/)?[^\/]+\/).*$/)[1];

Comme tout le monde dans l'Univers, je déteste lire les expressions régulières, alors je vais le décomposer en anglais:

  • Trouvez zéro ou plusieurs caractères alpha suivis de deux points (le protocole, qui peut être omis)
  • Suivi de // (peut également être omis)
  • Suivi de tous les caractères sauf / (le nom d'hôte et le port)
  • Suivi par /
  • Suivi de tout (le chemin, moins le début /).

Pas besoin de créer des éléments DOM ou de faire quelque chose de fou.

BMiner
la source
7

J'utilise une simple regex qui extrait l'hôte de l'url:

function get_host(url){
    return url.replace(/^((\w+:)?\/\/[^\/]+\/?).*$/,'$1');
}

et utilisez-le comme ça

var url = 'http://www.sitename.com/article/2009/09/14/this-is-an-article/'
var host = get_host(url);

Notez que si le urlne se termine pas par un, /le hostne se terminera pas par un /.

Voici quelques tests:

describe('get_host', function(){
    it('should return the host', function(){
        var url = 'http://www.sitename.com/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://www.sitename.com/');
    });
    it('should not have a / if the url has no /', function(){
        var url = 'http://www.sitename.com';
        assert.equal(get_host(url),'http://www.sitename.com');
    });
    it('should deal with https', function(){
        var url = 'https://www.sitename.com/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'https://www.sitename.com/');
    });
    it('should deal with no protocol urls', function(){
        var url = '//www.sitename.com/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'//www.sitename.com/');
    });
    it('should deal with ports', function(){
        var url = 'http://www.sitename.com:8080/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://www.sitename.com:8080/');
    });
    it('should deal with localhost', function(){
        var url = 'http://localhost/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://localhost/');
    });
    it('should deal with numeric ip', function(){
        var url = 'http://192.168.18.1/article/2009/09/14/this-is-an-article/';
        assert.equal(get_host(url),'http://192.168.18.1/');
    });
});
Michael_Scharf
la source
6

Vous pouvez utiliser les codes ci-dessous pour obtenir différents paramètres de l'URL actuelle

alert("document.URL : "+document.URL);
alert("document.location.href : "+document.location.href);
alert("document.location.origin : "+document.location.origin);
alert("document.location.hostname : "+document.location.hostname);
alert("document.location.host : "+document.location.host);
alert("document.location.pathname : "+document.location.pathname);
Nimesh07
la source
4
function getBaseURL() {
    var url = location.href;  // entire url including querystring - also: window.location.href;
    var baseURL = url.substring(0, url.indexOf('/', 14));


    if (baseURL.indexOf('http://localhost') != -1) {
        // Base Url for localhost
        var url = location.href;  // window.location.href;
        var pathname = location.pathname;  // window.location.pathname;
        var index1 = url.indexOf(pathname);
        var index2 = url.indexOf("/", index1 + 1);
        var baseLocalUrl = url.substr(0, index2);

        return baseLocalUrl + "/";
    }
    else {
        // Root Url for domain name
        return baseURL + "/";
    }

}

Vous pouvez ensuite l'utiliser comme ça ...

var str = 'http://en.wikipedia.org/wiki/Knopf?q=1&t=2';
var url = str.toUrl();

La valeur de l'url sera ...

{
"original":"http://en.wikipedia.org/wiki/Knopf?q=1&t=2",<br/>"protocol":"http:",
"domain":"wikipedia.org",<br/>"host":"en.wikipedia.org",<br/>"relativePath":"wiki"
}

"Var url" contient également deux méthodes.

var paramQ = url.getParameter('q');

Dans ce cas, la valeur de paramQ sera 1.

var allParameters = url.getParameters();

La valeur de allParameters correspondra uniquement aux noms de paramètres.

["q","t"]

Testé sur IE, Chrome et Firefox.

cheikh
la source
1
Je pense qu'il me manque quelque chose ... D'où vient toUrl?
thomasf1
3

Au lieu d'avoir à prendre en compte window.location.protocol et window.location.origin, et peut-être manquer un numéro de port spécifié, etc., il suffit de récupérer tout jusqu'au 3ème "/":

// get nth occurrence of a character c in the calling string
String.prototype.nthIndex = function (n, c) {
    var index = -1;
    while (n-- > 0) {
        index++;
        if (this.substring(index) == "") return -1; // don't run off the end
        index += this.substring(index).indexOf(c);
    }
    return index;
}

// get the base URL of the current page by taking everything up to the third "/" in the URL
function getBaseURL() {
    return document.URL.substring(0, document.URL.nthIndex(3,"/") + 1);
}
sova
la source
2

Cela marche:

location.href.split(location.pathname)[0];
Alain Beauvois
la source
1
échoue dans le cas oùlocation.pathname = '/'
mido
1

Vous pouvez le faire en utilisant une regex:

/(http:\/\/)?(www)[^\/]+\//i

est ce que ça va ?

Clément Herreman
la source
1
Hmm, d'après mes compétences limitées en regex, il semble que ce soit au moins proche. J'ajouterai quelques informations supplémentaires à la question pour voir si je peux aider à affiner le meilleur regex.
Bungle le
1
J'ai fini par utiliser .split ('/') sur la chaîne simplement parce que c'était une solution plus simple pour moi. Merci quand même pour vôtre aide!
Bungle le
2
URL https? Les noms d'hôtes ne commencent pas par www? Pourquoi capturer le www quand même?
Tim Down le
1
Je ne sais pas, l'OP a demandé comment attraper une URL, et dans son exemple, il y avait http & www.
Clement Herreman le
1

Pour obtenir l'origine de n'importe quelle URL, y compris les chemins dans un site Web ( /my/path) ou schemaless ( //example.com/my/path), ou complet (http://example.com/my/path ), j'ai mis en place une fonction rapide.

Dans l'extrait ci-dessous, les trois appels doivent être enregistrés https://stacksnippets.net.

function getOrigin(url)
{
  if(/^\/\//.test(url))
  { // no scheme, use current scheme, extract domain
    url = window.location.protocol + url;
  }
  else if(/^\//.test(url))
  { // just path, use whole origin
    url = window.location.origin + url;
  }
  return url.match(/^([^/]+\/\/[^/]+)/)[0];
}

console.log(getOrigin('https://stacksnippets.net/my/path'));
console.log(getOrigin('//stacksnippets.net/my/path'));
console.log(getOrigin('/my/path'));

Tom Kay
la source
0

Cela fonctionne pour moi:

var getBaseUrl = function (url) {
  if (url) {
    var parts = url.split('://');
    
    if (parts.length > 1) {
      return parts[0] + '://' + parts[1].split('/')[0] + '/';
    } else {
      return parts[0].split('/')[0] + '/';
    }
  }
};

abelabbesnabi
la source
0
var tilllastbackslashregex = new RegExp(/^.*\//);
baseUrl = tilllastbackslashregex.exec(window.location.href);

window.location.href donne l'adresse URL actuelle de la barre d'adresse du navigateur

cela peut être n'importe quoi comme https://stackoverflow.com/abc/xyz ou https://www.google.com/search?q=abc tilllastbackslashregex.exec () exécutez regex et relancez la chaîne correspondante jusqu'au dernier backslash, c'est-à-dire https : //stackoverflow.com/abc/ ou https://www.google.com/ respectivement

Hasib Ullah Khan
la source
5
Veuillez ajouter une brève description.
Préférence
6
De la file d'attente d'examen : Puis-je vous demander d'ajouter un peu de contexte autour de votre code source. Les réponses basées uniquement sur le code sont difficiles à comprendre. Cela aidera le demandeur et les futurs lecteurs si vous pouvez ajouter plus d'informations dans votre message.
RBT
0

Un bon moyen consiste à utiliser un URLobjet API natif JavaScript . Cela fournit de nombreuses parties d'url utiles.

Par exemple:

const url = '/programming/1420881/how-to-extract-base-url-from-a-string-in-javascript'

const urlObject = new URL(url);

console.log(urlObject);


// RESULT: 
//________________________________
hash: "",
host: "stackoverflow.com",
hostname: "stackoverflow.com",
href: "/programming/1420881/how-to-extract-base-url-from-a-string-in-javascript",
origin: "https://stackoverflow.com",
password: "",
pathname: "/questions/1420881/how-to-extract-base-url-from-a-string-in-javaript",
port: "",
protocol: "https:",
search: "",
searchParams: [object URLSearchParams]
... + some other methods

Comme vous pouvez le voir ici, vous pouvez accéder à tout ce dont vous avez besoin.

Par exemple: console.log(urlObject.host); // "stackoverflow.com"

doc pour URL

V. Sambor
la source