Come estrarre l'URL di base da una stringa in JavaScript?


168

Sto cercando di trovare un metodo relativamente semplice e affidabile per estrarre l'URL di base da una variabile stringa utilizzando JavaScript (o jQuery).

Ad esempio, dato qualcosa come:

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

Vorrei ottenere:

http://www.sitename.com/

Un'espressione regolare è la scommessa migliore? In tal caso, quale istruzione posso usare per assegnare l'URL di base estratto da una determinata stringa a una nuova variabile?

Ho fatto qualche ricerca su questo, ma tutto ciò che trovo nel mondo JavaScript sembra ruotare attorno alla raccolta di queste informazioni dall'URL del documento reale utilizzando location.host o simili.


La risposta ora dovrebbe essere questa qui sotto
davidmpaz

Risposte:


205

Modifica: alcuni si lamentano del fatto che non tiene conto del protocollo dell'account. Quindi ho deciso di aggiornare il codice, poiché è contrassegnato come risposta. Per coloro a cui piace il codice a una riga ... beh scusate questo perché utilizziamo i minimizzatori di codice, il codice dovrebbe essere leggibile dall'uomo e in questo modo è meglio ... secondo me.

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

Oppure usa la soluzione Davids dal basso.


6
Grazie per la risposta, ma sto ancora cercando di estrarre l'URL di base da una stringa, piuttosto che l'URL del documento effettivo. Non penso che questo mi aiuterà, anche se per favore, correggimi se sbaglio.
Bungle,

2
pathArray = String (" YourHost.com/url/nic/or/not").split ('/'); host = pathArray [2];

4
Capito - grazie Rafal e daddywoodland! Ho finito per usare: url = ' sitename.com/article/2009/09/14/this-is-an-article '; pathArray = (url) .split ('/'); host = 'http: //' + pathArray [2]; Penso che l'esempio di Rafal abbia appena omesso "http: //" presente in tutte le stringhe che sto elaborando, nel qual caso pathArray [2] è quello di cui hai bisogno. Senza il prefisso "http: //", pathArray [0] sarebbe quello. Grazie ancora.
Bungle,

4
Perché tutta la dichiarazione variabile? url = 'sitename.com/article/2009/09/14/this-is-an-article'; newurl = 'http://' + url.split('/')[0];
ErikE

1
pathArray = window.location.href.split ('/'); protocol = pathArray [0]; host = pathArray [2]; url = protocollo + ': //' + host; //now url === "http:://stackoverflow.com" checkout::

154

I browser basati su WebKit, Firefox a partire dalla versione 21 e le attuali versioni di Internet Explorer (IE 10 e 11) implementano location.origin.

location.origininclude il protocollo , il dominio e facoltativamente la porta dell'URL.

Ad esempio, location.originl'URL http://www.sitename.com/article/2009/09/14/this-is-an-article/è http://www.sitename.com.

Per indirizzare i browser senza supporto per l' location.originuso del seguente conciso polyfill:

if (typeof location.origin === 'undefined')
    location.origin = location.protocol + '//' + location.host;

36
window.location.hostnamemancherà il numero di porta, se fornito, quindi utilizzare window.location.host. Quindi il "basename" completo, inclusa la barra finale, sarebbe:window.location.protocol+"//"+window.location.host + "/";
sroebuck,

4
In realtà, window.location.hostname è ancora utile se, come nel mio caso, è necessario fornire un numero di porta diverso.
Darrell Brogdon,

44

Non è necessario utilizzare jQuery, basta usare

location.hostname

5
Grazie - Non posso usarlo con una stringa, però, posso? La mia comprensione è che funzionerà solo con l'URL del documento.
Bungle,

2
Ciò non includerà protocollo e porta.
David,

32

Non vi è alcun motivo per eseguire divisioni per ottenere il percorso, il nome host, ecc. Da una stringa che è un collegamento. Devi solo usare un link

//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);

Puoi farlo facilmente con jQuery aggiungendo l'elemento e leggendo il suo attr.


6
Perché aggiungere 50 KB di jQuery quando hai mostrato come farlo senza jQuery in pochi byte?
Tim Down,

13
Perché il poster dice che stanno usando jQuery.
epascarello,

1
Ah sì, abbastanza giusto. Anche se quando è così semplice non vedo alcun valore nell'usare il livello extra di astrazione che usando jQuery aggiungerebbe.
Tim Down,

2
Supponiamo che l'intero sito funzioni su jqUERY in quel caso, kquery semplificherebbe le cose.
trusktr,

2
Ewww ... questo non è il modo migliore per farlo ... Se si estrae da window.location.href, utilizzare window.location. Altrimenti, usa un regex.
BMiner,

21
var host = location.protocol + '//' + location.host + '/';

2
Questa dovrebbe essere considerata la risposta corretta - mantiene il protocollo
Katai il

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

}

Poi :

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

Per la tua richiesta, hai bisogno di:

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

Recensione 07-2017: può anche essere più elegante e ha più funzionalità

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}
}

Poi

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"

Freddo!


12

Se stai usando jQuery, questo è un modo fantastico per manipolare elementi in javascript senza aggiungerli al 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

1
Penso che dovrebbe essere myAnchor.prop('hostname'). Immagino che jQuery sia cambiato negli ultimi 5 anni ... Grazie per la risposta!
Dehli,

11

Un approccio semplice ma completo per ottenere valori di base da una rappresentazione in formato stringa di un URL è la regola regexp di 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]+'/' ;

Se stai cercando un toolkit di manipolazione degli URL più potente, prova URI.js Supporta getter, setter, normalizzazione degli url ecc. Tutto con una bella API concatenabile.

Se stai cercando un plug-in jQuery, jquery.url.js dovrebbe aiutarti

Un modo più semplice per farlo è utilizzare un elemento di ancoraggio, come suggerito da @epascarello. Questo ha lo svantaggio di dover creare un elemento DOM. Tuttavia, questo può essere memorizzato nella cache in una chiusura e riutilizzato per più 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
    };
  }
})();

Usalo così:

paserUrl('http://google.com');

10

Bene, l' oggetto API URL evita di dividere e costruire manualmente l'URL.

 let url = new URL('/programming/1420881');
 alert(url.origin);

8

Se stai estraendo informazioni da window.location.href (la barra degli indirizzi), usa questo codice per ottenere http://www.sitename.com/:

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

Se si dispone di una stringa, strovvero un URL arbitrario (non window.location.href), utilizzare le espressioni regolari:

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

Io, come tutti nell'universo, odio leggere le espressioni regolari, quindi lo analizzerò in inglese:

  • Trova zero o più caratteri alfa seguiti da due punti (il protocollo, che può essere omesso)
  • Seguito da // (può anche essere omesso)
  • Seguito da qualsiasi carattere tranne / (nome host e porta)
  • Seguito da /
  • Seguito da qualunque (il percorso, meno l'inizio /).

Non c'è bisogno di creare elementi DOM o fare qualcosa di folle.


7

Uso un regex semplice che estrae l'host dall'URL:

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

e usalo in questo modo

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

Nota, se il urlnon termina con un /il hostnon finirà in un /.

Ecco alcuni test:

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/');
    });
});

6

È possibile utilizzare i codici seguenti per ottenere diversi parametri dell'URL corrente

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);

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 + "/";
    }

}

Quindi puoi usarlo in questo modo ...

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

Il valore di url sarà ...

{
"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"
}

Il "var url" contiene anche due metodi.

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

In questo caso il valore di paramQ sarà 1.

var allParameters = url.getParameters();

Il valore di allParameters sarà solo il nome del parametro.

["q","t"]

Testato su IE, Chrome e Firefox.


1
Penso che mi manchi qualcosa ... Da dove viene l'Url?
thomasf1

3

Invece di dover tenere conto di window.location.protocol e window.location.origin e possibilmente perdere un numero di porta specificato, ecc., Prendi tutto fino al 3 "/":

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

2

Questo funziona:

location.href.split(location.pathname)[0];

1
fallisce nel caso in cuilocation.pathname = '/'
mido,

1

Puoi farlo usando un regex:

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

si adatta?


1
Hmm, dalle mie abilità di regex limitate, sembra che sia almeno vicino. Aggiungerò alcune ulteriori informazioni alla domanda per vedere se posso aiutare a restringere il regex migliore.
Bungle,

1
Ho finito per usare .split ('/') sulla stringa solo perché era una soluzione più semplice per me. Grazie per l'aiuto, però!
Bungle,

2
URL https? I nomi host non iniziano con www? Perché catturare comunque il www?
Tim Down

1
Non lo so, l'OP ha chiesto come catturare un url e nel suo esempio c'erano http e www.
Clemente Herreman,

1

Per ottenere l'origine di qualsiasi URL, inclusi i percorsi all'interno di un sito Web ( /my/path) o schemaless ( //example.com/my/path) o full ( http://example.com/my/path), ho creato una funzione rapida.

Nel frammento di seguito, tutte e tre le chiamate dovrebbero essere registrate 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'));


0

Questo, funziona per me:

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] + '/';
    }
  }
};


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

window.location.href fornisce l'indirizzo url corrente dalla barra degli indirizzi del browser

può essere qualsiasi cosa come https://stackoverflow.com/abc/xyz o https://www.google.com/search?q=abc tilllastbackslashregex.exec () eseguire regex e risintonizzare la stringa corrispondente fino all'ultima barra rovesciata cioè https : //stackoverflow.com/abc/ o https://www.google.com/ rispettivamente


5
Si prega di aggiungere una breve descrizione.
Preimpostato il

6
Dalla coda di revisione : posso chiederti di aggiungere un po 'di contesto attorno al tuo codice sorgente. Le risposte di solo codice sono difficili da capire. Aiuterà il richiedente e i futuri lettori sia se è possibile aggiungere ulteriori informazioni nel tuo post.
RBT

0

Un buon modo è usare l' URLoggetto API nativo JavaScript . Ciò fornisce molte parti utili dell'URL.

Per esempio:

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

Come puoi vedere qui puoi accedere a tutto ciò di cui hai bisogno.

Per esempio: console.log(urlObject.host); // "stackoverflow.com"

doc per URL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.