Подтвердить что ты не робот

Как анализировать URL?

Если есть одна вещь, которую я просто не могу опустить, это регулярное выражение.

Итак, после многого поиска я наконец нашел тот, который соответствует моим потребностям:

function get_domain_name()
    { 
    aaaa="http://www.somesite.se/blah/sdgsdgsdgs";
    //aaaa="http://somesite.se/blah/sese";
        domain_name_parts = aaaa.match(/:\/\/(.[^/]+)/)[1].split('.');
        if(domain_name_parts.length >= 3){
            domain_name_parts[0] = '';
        }
        var domain = domain_name_parts.join('.');
        if(domain.indexOf('.') == 0)
            alert("1"+ domain.substr(1));
        else
            alert("2"+ domain);
    }

Это в основном возвращает мне доменное имя, есть ли в любом случае я также могу получить всю информацию после имени домена? в этом случае это будет /blah/sdgsdgsdgs из переменной aaaa.

4b9b3361

Ответ 1

Обратите внимание, что это решение не лучшее. Я сделал это только для соответствия требованиям OP. Я лично предложил бы изучить другие ответы.

Следующее regexp вернет вам домен и все остальное. :\/\/(.[^\/]+)(.*):

  • www.google.com
  • /goosomething

Я предлагаю вам изучить документацию RegExp здесь: http://www.regular-expressions.info/reference.html

Использование вашей функции:

function get_domain_name()
    { 
    aaaa="http://www.somesite.se/blah/sdgsdgsdgs";
    //aaaa="http://somesite.se/blah/sese";
        var matches = aaaa.match(/:\/\/(?:www\.)?(.[^/]+)(.*)/);
        alert(matches[1]);
        alert(matches[2]);
    }

Ответ 2

Вместо того чтобы полагаться на потенциально ненадежное регулярное выражение *, вы должны вместо этого использовать встроенный анализатор URL, который предоставляет API DOM JavaScript:

var url = document.createElement('a');
url.href = "http://www.example.com/some/path?name=value#anchor";

Это все, что вам нужно сделать, чтобы разобрать URL. Все остальное - просто доступ к проанализированным значениям:

url.protocol; //(http:)
url.hostname; //(www.example.com)
url.pathname; //(/some/path)
url.search; // (?name=value)
url.hash; //(#anchor)

В этом случае, если вы ищете /blah/sdgsdgsdgs, вы получите к нему доступ с помощью url.pathname

По сути, вы просто создаете ссылку (технически, якорный элемент) в JavaScript, а затем можете напрямую вызывать проанализированные фрагменты. (Поскольку вы не добавляете его в DOM, он не добавляет нигде невидимых ссылок.) Доступ к нему осуществляется так же, как значения объекта location.

(Вдохновленный этим замечательным ответом.)

ОБНОВЛЕНИЕ: Важное примечание: похоже, что в Internet Explorer есть ошибка, в которой он пропускает начальную косую черту в атрибуте pathname на подобных объектах. Вы можете нормализовать это, сделав что-то вроде:

 url.pathname = url.pathname.replace(/(^\/?)/,"/");

Примечание: *: Я говорю "потенциально ненадежный", поскольку может возникнуть соблазн попытаться создать или найти всеобъемлющий парсер URL, но существует множество условий, крайних случаев и прощающих методов анализа, которые могут не учитываться или не поддерживаться должным образом; браузеры, вероятно, лучше всего реализуют (поскольку разбор URL-адресов имеет решающее значение для их правильной работы) этой логики, поэтому мы должны сохранить ее простоту и оставить ее им.

Ответ 3

RFC (см. добавление B) предоставляет регулярное выражение для анализа частей URI:

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
 12            3  4          5       6  7        8 9

где

scheme    = $2
authority = $4
path      = $5
query     = $7
fragment  = $9

Пример:

function parse_url(url) {
    var pattern = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
    var matches =  url.match(pattern);
    return {
        scheme: matches[2],
        authority: matches[4],
        path: matches[5],
        query: matches[7],
        fragment: matches[9]
    };
}
console.log(parse_url("http://www.somesite.se/blah/sdgsdgsdgs"));

дает

Object
    authority: "www.somesite.se"
    fragment: undefined
    path: "/blah/sdgsdgsdgs"
    query: undefined
    scheme: "http"

DEMO

Ответ 4

Вам просто нужно немного изменить свое регулярное выражение. Например:

var aaaa="http://www.somesite.se/blah/sdgsdgsdgs";
var m = aaaa.match(/^[^:]*:\/\/([^\/]+)(\/.*)$/);

m будет содержать следующие части:

["http://www.somesite.se/blah/sdgsdgsdgs", "www.somesite.se", "/blah/sdgsdgsdgs"]

Вот тот же пример, но изменен так, чтобы он разделил "www". часть. Я думаю, что регулярное выражение должно быть написано так, что совпадение будет работать независимо от того, есть ли у вас "www". часть. Поэтому проверьте это:

var aaaa="http://www.somesite.se/blah/sdgsdgsdgs";
var m = aaaa.match(/^[^:]*:\/\/(www\.)?([^\/]+)(\/.*)$/);

m будет содержать следующие части:

["http://www.somesite.se/blah/sdgsdgsdgs", "www.", "somesite.se", "/blah/sdgsdgsdgs"]

Теперь проверьте одно и то же регулярное выражение, но с URL-адресом, который не начинается с "www.":

var bbbb="http://somesite.se/blah/sdgsdgsdgs";
var m = .match(/^[^:]*:\/\/(www\.)?([^\/]+)(\/.*)$/);

Теперь ваш матч выглядит следующим образом:

["http://somesite.se/blah/sdgsdgsdgs", undefined, "somesite.se", "/blah/sdgsdgsdgs"]

Итак, как вы можете видеть, в обоих случаях это будет сделано правильно.

Ответ 5

Есть хороший плагин jQuery для разбора URL: Purl.

Все регулярные выражения скрыты внутри, и вы получите что-то вроде:

> url = $.url("http://markdown.com/awesome/language/markdown.html?show=all#top");

> url.attr('source');
"http://markdown.com/awesome/language/markdown.html?show=all#top"

> url.attr('protocol');
"http"

> url.attr('host');
"markdown.com"

> url.attr('relative');
"/awesome/language/markdown.html?show=all#top"

> url.attr('path');
"/awesome/language/markdown.html"

> url.attr('directory');
"/awesome/language/"

> url.attr('file');
"markdown.html"

> url.attr('query');
"show=all"

> url.attr('fragment');
"top"

Ответ 6

Браузеры прошли долгий путь с тех пор, как этот вопрос был впервые задан. Теперь вы можете использовать собственный URL-интерфейс для этого:

const url = new URL('http://www.somesite.se/blah/sdgsdgsdgs')

console.log(url.host) // "www.somesite.se"
console.log(url.href) // "http://www.somesite.se/blah/sdgsdgsdgs"
console.log(url.origin) // "http://www.somesite.se"
console.log(url.pathname) // "/blah/sdgsdgsdgs"
console.log(url.protocol) // "http:"
// etc.

Помните, что IE не поддерживает этот API. Но вы можете легко заполнить его с помощью polyfill.io:

<script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js?flags=gated&features=URL"></script>