Как извлечь базовый URL из строки в JavaScript? - PullRequest
159 голосов
/ 14 сентября 2009

Я пытаюсь найти относительно простой и надежный способ извлечения базового URL из строковой переменной с помощью JavaScript (или jQuery).

Например, что-то вроде:

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

Я бы хотел получить:

http://www.sitename.com/

Является ли регулярное выражение лучшей ставкой? Если да, то какой оператор можно использовать для назначения базового URL-адреса, извлеченного из заданной строки, новой переменной?

Я провел некоторый поиск по этому вопросу, но все, что я нахожу в мире JavaScript, похоже, вращается вокруг сбора этой информации из фактического URL документа, используя location.host или подобное.

Ответы [ 18 ]

5 голосов
/ 28 декабря 2011

Если вы извлекаете информацию из window.location.href (адресная строка), используйте этот код для получения http://www.sitename.com/:

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

Если у вас есть строка str, которая является произвольным URL (не window.location.href), используйте регулярные выражения:

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

Я, как и все во Вселенной, ненавижу читать регулярные выражения, поэтому я выделю их на английском:

  • Найти ноль или более буквенных символов, за которыми следует двоеточие (протокол, который можно опустить)
  • С последующим // (также может быть опущено)
  • После любых символов кроме / (имя хоста и порт)
  • Вслед за /
  • За чем следует (путь, за исключением начала /).

Нет необходимости создавать элементы DOM или делать что-то сумасшедшее.

4 голосов
/ 11 января 2013
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 + "/";
    }

}

Затем вы можете использовать это так ...

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

Значение URL будет ...

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

"URL-адрес переменной" также содержит два метода.

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

В этом случае значение paramQ будет равно 1.

var allParameters = url.getParameters();

Значением allParameters будут только имена параметров.

["q","t"]

Проверено на IE, Chrome и Firefox.

4 голосов
/ 21 мая 2018

Ну, объект URL API избегает разбиения и создания URL-адресов вручную.

 let url = new URL('https://stackoverflow.com/questions/1420881');
 alert(url.origin);
3 голосов
/ 11 января 2012

Вместо необходимости учитывать window.location.protocol и window.location.origin и, возможно, пропустить указанный номер порта и т. Д., Просто захватите все до 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 голосов
/ 09 февраля 2012

Это работает:

location.href.split(location.pathname)[0];
2 голосов
/ 14 сентября 2009

Вы можете сделать это с помощью регулярного выражения:

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

подходит?

0 голосов
/ 05 декабря 2017
var tilllastbackslashregex = new RegExp(/^.*\//);
baseUrl = tilllastbackslashregex.exec(window.location.href);
0 голосов
/ 11 мая 2017

Это, у меня работает:

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] + '/';
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...