Як отримати базову URL-адресу з рядка в JavaScript?


168

Я намагаюся знайти відносно простий і надійний метод витягти базову URL-адресу зі змінної рядка за допомогою JavaScript (або jQuery).

Наприклад, подано щось на зразок:

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

Я хотів би отримати:

http://www.sitename.com/

Чи є регулярним виразом найкраща ставка? Якщо так, то який вислів я можу використовувати, щоб призначити новій змінній базовій URL-адресі, вилученій із заданого рядка?

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


Відповідь на сьогоднішній день має бути такою нижче
давидмпаз

Відповіді:


205

Редагувати: Деякі скаржаться, що він не враховує протокол. Тому я вирішив оновити код, оскільки він позначений як відповідь. Для тих, хто любить однорядковий код ... добре вибачте, чому ми використовуємо мінімізатори коду, код має бути читабельним для людей, і цей спосіб краще ... на мою думку.

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

Або використовуйте розчин Девідса знизу.


6
Дякую за відповідь, але знову ж таки, я намагаюся отримати базову URL-адресу зі строки, а не з фактичної URL-адреси документа. Я не думаю, що це допоможе мені, хоча, будь ласка, виправте мене, якщо я помиляюся.
Bungle

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

4
Зрозумів - спасибі Рафал та таддівуд! Я в кінцевому рахунку використовував: url = ' sitename.com/article/2009/09/14/this-is-an-article '; pathArray = (url) .split ('/'); host = 'http: //' + pathArray [2]; Я думаю, що приклад Рафаль просто опустив "http: //", який присутній у всіх рядках, які я обробляю, і в такому випадку вам потрібен pathArray [2]. Без префікса "http: //", pathArray [0] був би таким. Знову дякую.
Bungle

4
Чому всі декларації змінної? url = 'sitename.com/article/2009/09/14/this-is-an-article'; newurl = 'http://' + url.split('/')[0];
ЕрікЕ

1
pathArray = window.location.href.split ('/'); протокол = pathArray [0]; host = pathArray [2]; url = протокол + ': //' + хост; //now url === "http:://stackoverflow.com" замовлення::

154

Реалізовано браузери на основі WebKit, Firefox версії 21 та поточні версії Internet Explorer (IE 10 та 11) location.origin.

location.originвключає протокол , домен і необов'язково порт URL.

Наприклад, location.originURL-адреса http://www.sitename.com/article/2009/09/14/this-is-an-article/є http://www.sitename.com.

Щоб орієнтуватися на браузери без підтримки, location.originвикористовуйте таку стислу поліфунку:

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

36
window.location.hostnameбуде пропущено номер порту, якщо він вказаний, тому використовуйте window.location.host. Таким чином, повне "базове ім'я", включаючи window.location.protocol+"//"+window.location.host + "/";
кінцеву косу рису,

4
Насправді, window.location.hostname все ще корисний, якщо, як і в моєму випадку, вам потрібно вказати інший номер порту.
Даррелл Брогдон

44

Не потрібно використовувати jQuery, просто використовуйте

location.hostname

5
Спасибі - однак я не можу використовувати це за допомогою рядка, чи не можу? Я розумію, що працюватиме лише з URL-адресою документа.
Bungle

2
Це не буде включати протокол та порт.
Девід

32

Немає причини робити розбивки, щоб отримати шлях, ім'я хоста тощо з рядка, що є посиланням. Вам просто потрібно використовувати посилання

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

Ви можете легко зробити це, додавши елемент jQuery і прочитавши його attr.


6
Навіщо додавати 50K jQuery, коли ви показали, як це зробити без jQuery в декілька байтів?
Тім Даун

13
Тому що плакат говорить, що вони використовують jQuery.
epascarello

1
Ага так, досить справедливо. Хоча, коли це так просто, я не бачу ніякого значення у використанні додаткового шару абстракції, який використовує jQuery.
Тім Даун

2
Ми припускаємо, що весь сайт працює на jqUERY у такому випадку, kquery дійсно спростить речі.
trusktr

2
Ewww ... це не найкращий спосіб зробити це ... Якщо витягуєте з window.location.href, використовуйте window.location. В іншому випадку використовуйте регулярний вираз.
BMiner

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

2
Це слід вважати правильною відповіддю - він зберігає протокол
Катаї

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

}

Тоді :

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

Для вашого запиту вам потрібно:

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

Огляд 07-2017: Він також може бути більш елегантним та має більше можливостей

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

Тоді

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"

Класно!


12

Якщо ви використовуєте jQuery, це якийсь класний спосіб маніпулювати елементами в JavaScript без додавання їх до 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
Я думаю, що так і має бути myAnchor.prop('hostname'). Я здогадуюсь, що jQuery змінився за останні 5 років ... Дякую за відповідь!
Делі

11

Полегшеним, але повним підходом до отримання основних значень із рядкового подання URL-адреси є правило регулярного відбиття Дугласа Крокфорда:

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

Якщо ви шукаєте більш потужний інструментарій маніпуляції з URL-адресою, спробуйте URI.js, він підтримує геттери, сетери , нормалізацію URL тощо.

Якщо ви шукаєте плагін jQuery, тоді jquery.url.js повинен вам допомогти

Найпростіший спосіб зробити це за допомогою елемента якоря, як запропонував @epascarello. Це має той недолік, що вам потрібно створити елемент DOM. Однак це може бути кешоване в закритому режимі та повторно використати для кількох 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
    };
  }
})();

Використовуйте його так:

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

10

Добре, що URL-об’єкт API дозволяє уникати розбиття та побудови URL-адреси вручну.

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

8

Якщо ви виймаєте інформацію з 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 або робити щось божевільне.


7

Я використовую простий регулярний вираз, який витягує хост із URL-адреси:

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

і використовувати його так

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

Зверніть увагу, якщо urlне закінчується з не закінчиться в ./host/

Ось кілька тестів:

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

Ви можете використовувати коди нижче, щоб отримати різні параметри Поточна URL-адреса

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

}

Потім ви можете використовувати це так ...

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

"Var url" також містить два способи.

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

У цьому випадку значення paramQ буде 1.

var allParameters = url.getParameters();

Значення всіх параметрів буде лише іменем параметрів.

["q","t"]

Тестували на IE, хромі та firefox.


1
Я думаю, що я щось пропускаю ... Звідки береться Урл?
thomasf1

3

Замість того, щоб обліковувати 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);
}


1

Ви можете зробити це за допомогою регулярного вираження:

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

чи підходить вона?


1
Хм, з моїх обмежених навичок регулярного вираження, схоже, що це принаймні близько. Додамо ще трохи інформації до питання, щоб побачити, чи можу я допомогти звузити найкращий вираз.
Bungle

1
Я в кінцевому підсумку використав .split ('/') на рядку лише тому, що це було простішим рішенням для мене. Дякую за вашу допомогу!
Bungle

2
https URL-адреси? Імена хостів не починаються з www? Навіщо все-таки захоплювати www?
Тім Даун

1
Я не знаю, ОП запитав, як зловити URL-адресу, і в його прикладі було http & www.
Климент Ерреман

1

Щоб отримати походження будь-якого URL-адреси, включаючи шляхи в межах веб-сайту ( /my/path) або без схем ( //example.com/my/path), або full ( http://example.com/my/path), я зібрав швидку функцію.

У фрагменті, наведеному нижче, усі три виклики повинні входити в журнал 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

Це працює для мене:

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 надає поточну адресу URL-адреси з адресного рядка браузера

це може бути будь-яка річ, як https://stackoverflow.com/abc/xyz або https://www.google.com/search?q=abc tilllastbackslashregex.exec (), запустіть регулярний вираз і перезавантажте відповідний рядок до останнього зворотного косого риса, тобто https : //stackoverflow.com/abc/ або https://www.google.com/ відповідно


5
Будь ласка, додайте короткий опис.
Преет

6
З черги на огляд : чи можу я попросити вас додати якийсь контекст навколо свого вихідного коду. Відповіді, що стосуються лише коду, важко зрозуміти. Це допоможе запитувачу та майбутнім читачам, якщо ви зможете додати більше інформації у своєму дописі.
RBT

0

Хороший спосіб - використовувати рідну версію api JavaScript URL об’єкт . Це забезпечує багато корисних частин URL.

Наприклад:

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

Як ви бачите тут, ви можете просто отримати доступ до всього, що вам потрібно.

Наприклад: console.log(urlObject.host); // "stackoverflow.com"

doc для URL

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.