web-dev-qa-db-fra.com

Comment extraire l'hôte d'une URL en JavaScript?

Capturez le domaine jusqu'à la fin des caractères $, \?, /, :. J'ai besoin d'un regex qui capture domian.com dans tout cela.

domain.com:3000
domain.com?pass=gas
domain.com/
domain.com
16
ThomasReggi

Si vous avez réellement des URL valides, cela fonctionnera:

var urls = [
    'http://domain.com:3000',
    'http://domain.com?pass=gas',
    'http://domain.com/',
    'http://domain.com'
];

for (x in urls) {
    var a = document.createElement('a');
    a.href = urls[x];
    console.log(a.hostname);
}

//=> domain.com
//=> domain.com
//=> domain.com
//=> domain.com

Notez que l'utilisation de regex pour ce genre de choses est absurde lorsque le langage que vous utilisez a d'autres méthodes intégrées.

Autres propriétés disponibles sur les éléments A.

var a = document.createElement('a');
a.href = "http://domain.com:3000/path/to/something?query=string#fragment"

a.protocol   //=> http:
a.hostname   //=> domain.com
a.port       //=> 3000
a.pathname   //=> /path/to/something
a.search     //=> ?query=string
a.hash       //=> #fragment
a.Host       //=> domain.com:3000

EDIT # 2

Après mûre réflexion, j’ai jeté un œil dans la documentation de Node.js et trouvé ce petit bijou: url#parse

Le code ci-dessus peut être réécrit comme suit:

var url = require('url');

var urls = [
    'http://domain.com:3000',
    'http://domain.com?pass=gas',
    'http://domain.com/',
    'http://domain.com'
];

for (x in urls) {
    console.log(url.parse(urls[x]).hostname);
}

//=> domain.com
//=> domain.com
//=> domain.com
//=> domain.com

EDIT # 1

Consultez l'historique de révision de ce message si vous souhaitez savoir comment résoudre ce problème à l'aide de jsdom et nodejs.

41
maček

Puisque vous utilisez node, utilisez simplement la méthode intégrée url.parse(); vous voulez la propriété hostname résultante:

var url=require('url');
var urls = [
  'http://domain.com:3000',
  'http://domain.com?pass=gas',
  'http://domain.com/',
  'http://domain.com'
];

MIS À JOUR:

urls.forEach(function(x) {
  console.log(url.parse(x).hostname);
});
19
ebohlman

J'utilise le noeud 10.9.0 et voici comment je le fais.

var URL = require('url')
var url = URL.parse('http://stackoverflow.com')
console.log(url.hostname)
//=> stackoverflow.com
0
rb-
/^((?:[a-z0-9-_]+\.)*[a-z0-9-_]+\.?)(?::([0-9]+))?(.*)$/i

les correspondances sont hôte, port, chemin

0
stroncium

Un nouveau challenger est apparu. Selon la documentation du noeud, vous pouvez également utiliser 

   var url = new URL(urlString);
   console.log(url.hostname);

https://nodejs.org/api/url.html#url_the_whatwg_url_api

Cela semble être un moyen plus courant.

0
Paul Weber