¿Cómo extraer la URL base de una cadena en JavaScript?

168

Estoy tratando de encontrar un método relativamente fácil y confiable para extraer la URL base de una variable de cadena usando JavaScript (o jQuery).

Por ejemplo, dado algo como:

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

Me gustaría obtener:

http://www.sitename.com/

¿Es una expresión regular la mejor apuesta? Si es así, ¿qué enunciado podría usar para asignar la URL base extraída de una cadena dada a una nueva variable?

He buscado un poco sobre esto, pero todo lo que encuentro en el mundo de JavaScript parece girar en torno a la recopilación de esta información de la URL del documento real usando location.host o similar.

Estropear
fuente
La respuesta de now days debería ser esta a continuación
davidmpaz

Respuestas:

205

Editar: Algunos se quejan de que no tiene en cuenta el protocolo. Así que decidí actualizar el código, ya que está marcado como respuesta. Para aquellos a los que les gusta el código de una línea ... bueno, lamento por eso que usamos minimizadores de código, el código debería ser legible por humanos y de esta manera es mejor ... en mi opinión.

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

O use la solución Davids desde abajo.

itzhar
fuente
66
Gracias por la respuesta, pero nuevamente, estoy tratando de extraer la URL base de una cadena, en lugar de la URL del documento real. No creo que esto me ayude, aunque corrígeme si me equivoco.
Bungle
2
pathArray = String (" YourHost.com/url/nic/or/not").split ('/'); host = pathArray [2];
44
Lo tengo, ¡gracias Rafal y daddywoodland! Terminé usando: url = ' sitename.com/article/2009/09/14/this-is-an-article '; pathArray = (url) .split ('/'); host = 'http: //' + pathArray [2]; Creo que el ejemplo de Rafal simplemente omitió el "http: //" que está presente en todas las cadenas que estoy procesando, en cuyo caso el pathArray [2] es el que necesita. Sin el prefijo "http: //", pathArray [0] sería el indicado. Gracias de nuevo.
Bungle
44
¿Por qué toda la declaración 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 ('/'); protocolo = matriz de ruta [0]; host = pathArray [2]; url = protocolo + ': //' + host; //now url === "http:://stackoverflow.com" pago::
154

Los navegadores basados ​​en WebKit, Firefox a partir de la versión 21 y las versiones actuales de Internet Explorer (IE 10 y 11) implementan location.origin.

location.originincluye el protocolo , el dominio y opcionalmente el puerto de la URL.

Por ejemplo, location.originde la URL http://www.sitename.com/article/2009/09/14/this-is-an-article/es http://www.sitename.com.

Para apuntar a navegadores sin soporte para location.originusar el siguiente polyfill conciso:

if (typeof location.origin === 'undefined')
    location.origin = location.protocol + '//' + location.host;
David
fuente
36
window.location.hostnameperderá el número de puerto si se proporciona, así que úselo window.location.host. Entonces, el 'nombre base' completo, incluida la barra inclinada final sería:window.location.protocol+"//"+window.location.host + "/";
sroebuck
44
En realidad, window.location.hostname sigue siendo útil si, como en mi caso, necesita proporcionar un número de puerto diferente.
Darrell Brogdon
44

No es necesario usar jQuery, solo use

location.hostname
daddywoodland
fuente
55
Gracias. Sin embargo, no puedo usar eso con una cuerda. Entiendo que solo funcionará con la URL del documento.
Bungle
2
Esto no incluirá el protocolo y el puerto.
David
32

No hay razón para hacer divisiones para obtener la ruta, el nombre de host, etc. de una cadena que es un enlace. Solo necesitas usar un enlace

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

Puede hacerlo fácilmente con jQuery agregando el elemento y leyendo su atributo.

epascarello
fuente
66
¿Por qué agregar 50K de jQuery cuando ha mostrado cómo hacerlo sin jQuery en unos pocos bytes?
Tim Down
13
Porque el cartel dice que están usando jQuery.
epascarello
1
Ah sí, bastante justo. Aunque cuando es tan simple como esto, no veo ningún valor en usar la capa adicional de abstracción que agregaría jQuery.
Tim Down
2
Asumimos que todo el sitio se ejecuta en jqUERY en ese caso, kquery realmente simplificaría las cosas.
trusktr
2
Ewww ... esta no es la mejor manera de hacer esto ... Si extrae de window.location.href, use window.location. De lo contrario, use una expresión regular.
BMiner
21
var host = location.protocol + '//' + location.host + '/';
kta
fuente
2
Esta debe considerarse la respuesta correcta: mantiene el protocolo
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};

}

Luego :

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

Para su solicitud, necesita:

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

Revisión 07-2017: también puede ser más elegante y tiene más características

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

Luego

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"

¡Frio!

Abdennour TOUMI
fuente
12

Si está utilizando jQuery, esta es una forma genial de manipular elementos en JavaScript sin agregarlos 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
Wayne
fuente
1
Creo que debería serlo myAnchor.prop('hostname'). Supongo que jQuery ha cambiado en los últimos 5 años ... ¡Gracias por la respuesta!
Dehli
11

Un enfoque ligero pero completo para obtener valores básicos de una representación de cadena de una URL es la regla de expresión regular 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 está buscando un kit de herramientas de manipulación de URL más potente, pruebe URI.js. Es compatible con getters, setter, normalización de URL, etc., todo con una buena API encadenable.

Si está buscando un complemento jQuery, jquery.url.js debería ayudarlo

Una forma más sencilla de hacerlo es mediante el uso de un elemento de anclaje, como sugirió @epascarello. Esto tiene la desventaja de que tiene que crear un elemento DOM. Sin embargo, esto se puede almacenar en caché en un cierre y reutilizar para múltiples 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
    };
  }
})();

Úselo así:

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

Bueno, el objeto URL API evita dividir y construir las URL manualmente.

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

Si está extrayendo información de window.location.href (la barra de direcciones), use este código para obtener http://www.sitename.com/:

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

Si tiene una cadena, stresa es una URL arbitraria (no window.location.href), entonces use expresiones regulares:

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

Yo, como todos en el Universo, odio leer expresiones regulares, así que lo desglosaré en inglés:

  • Encuentre cero o más caracteres alfabéticos seguidos de dos puntos (el protocolo, que puede omitirse)
  • Seguido de // (también se puede omitir)
  • Seguido de cualquier carácter excepto / (el nombre de host y el puerto)
  • Seguido por /
  • Seguido por lo que sea (el camino, menos el principio /).

No es necesario crear elementos DOM ni hacer nada loco.

BMiner
fuente
7

Utilizo una expresión regular simple que extrae el host de la url:

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

y úsalo así

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

Nota, si el urlno termina con un /el hostno va a terminar en una /.

Aquí hay algunas pruebas:

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
fuente
6

Puede usar los siguientes códigos para obtener diferentes parámetros de la URL actual

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

}

Entonces puedes usarlo así ...

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

El valor de url será ...

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

La "var url" también contiene dos métodos.

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

En este caso, el valor de paramQ será 1.

var allParameters = url.getParameters();

El valor de allParameters serán solo los nombres de los parámetros.

["q","t"]

Probado en IE, Chrome y Firefox.

shaikh
fuente
1
Creo que me falta algo ... ¿De dónde viene Urul?
thomasf1
3

En lugar de tener que tener en cuenta window.location.protocol y window.location.origin, y posiblemente perder un número de puerto específico, etc., simplemente tome todo hasta el 3er "/":

// 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
fuente
2

Esto funciona:

location.href.split(location.pathname)[0];
Alain Beauvois
fuente
1
falla en el caso dondelocation.pathname = '/'
mido
1

Puedes hacerlo usando una expresión regular:

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

encaja ?

Clemente Herreman
fuente
1
Hmm, por mis limitadas habilidades de expresión regular, parece que al menos está cerca. Agregaré más información a la pregunta para ver si puedo ayudar a reducir la mejor expresión regular.
Bungle
1
Terminé usando .split ('/') en la cadena solo porque era una solución más fácil para mí. ¡Gracias por tu ayuda, sin embargo!
Bungle
2
https URL? Los nombres de host no comienzan con www? ¿Por qué capturar el www de todos modos?
Tim Down
1
No sé, el OP preguntó cómo atrapar una url, y en su ejemplo había http & www.
Clement Herreman
1

Para obtener el origen de cualquier URL, incluidas las rutas dentro de un sitio web ( /my/path) o sin esquema ( //example.com/my/path), o completo ( http://example.com/my/path) , armé una función rápida.

En el fragmento a continuación, las tres llamadas deben registrarse 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
fuente
0

Esto funciona para mí:

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
fuente
0
var tilllastbackslashregex = new RegExp(/^.*\//);
baseUrl = tilllastbackslashregex.exec(window.location.href);

window.location.href proporciona la dirección URL actual de la barra de direcciones del navegador

puede ser algo como https://stackoverflow.com/abc/xyz o https://www.google.com/search?q=abc tilllastbackslashregex.exec () ejecute regex y vuelva a ejecutar la cadena coincidente hasta la última barra invertida, es decir, https : //stackoverflow.com/abc/ o https://www.google.com/ respectivamente

Hasib Ullah Khan
fuente
55
Por favor agregue una breve descripción.
Saludo el
66
De la cola de revisión : ¿Puedo solicitarle que agregue algo de contexto alrededor de su código fuente? Las respuestas de solo código son difíciles de entender. Ayudará tanto al autor de la pregunta como a los futuros lectores si puede agregar más información en su publicación.
RBT
0

Una buena manera es usar el URLobjeto de API nativa de JavaScript . Esto proporciona muchas partes útiles de url.

Por ejemplo:

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

Como puede ver aquí, puede acceder a lo que necesite.

Por ejemplo: console.log(urlObject.host); // "stackoverflow.com"

doc para URL

V. Sambor
fuente