Como analisar um URL?

Se há uma coisa que eu simplesmente não consigo entender, é regex.

Então, depois de muita pesquisa, finalmente encontrei esta que atende às minhas necessidades:

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

Ele basicamente me devolve o nome de domínio, existe mesmo assim eu também posso pegar todas as coisas depois do nome de domínio? neste caso, seria /blah/sdgsdgsdgs da variável aaaa .

Por favor, note que esta solução não é a melhor. Eu fiz isso apenas para atender aos requisitos do OP. Eu pessoalmente sugiro olhar para as outras respostas.

O seguinte regexp lhe dará de volta o domínio e o resto. :\/\/(.[^\/]+)(.*) :

  1. http://www.google.com
  2. / goosomething

Eu sugiro que você estude a documentação do RegExp aqui: http://www.regular-expressions.info/reference.html

Usando sua function:

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

Em vez de depender de um * regex * potencialmente não confiável, você deve usar o analisador de URL integrado que a API DOM do JavaScript fornece:

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

Isso é tudo que você precisa fazer para analisar o URL. Tudo o resto é apenas acessar os valores analisados:

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

Neste caso, se você está procurando por /blah/sdgsdgsdgs , você pode acessá-lo com url.pathname

Basicamente, você está apenas criando um link (tecnicamente, elemento de âncora) em JavaScript, e então você pode fazer chamadas para as partes analisadas diretamente. (Como você não o adiciona ao DOM, ele não adiciona nenhum link invisível em nenhum lugar.) Ele é acessado da mesma forma que os valores no object de location .

(Inspirado por esta maravilhosa resposta )

EDIT: Uma observação importante: parece que o Internet Explorer tem um bug onde omite a barra inicial do atributo pathname em objects como este. Você poderia normalizá-lo fazendo algo como:

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

Nota: *: Eu digo “potencialmente não confiável”, pois pode ser tentador tentar criar ou encontrar um analisador de URL abrangente, mas há muitas, muitas condições, casos de borda e técnicas de análise de perdão que podem não ser consideradas ou corretamente suportado; Os navegadores são provavelmente os melhores para implementar (já que a análise de URLs é fundamental para a operação correta) essa lógica, portanto, devemos mantê-la simples e deixar isso para eles.

O RFC (consulte o apêndice B) fornece uma expressão regular para analisar as partes do URI:

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

Onde

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

Exemplo:

 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

Você só precisa modificar seu regex um pouco. Por exemplo:

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

m conterá as seguintes partes:

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

Aqui está o mesmo exemplo, mas modificado para dividir o “www”. parte. Eu acho que a expressão regular deve ser escrita para que o jogo funcione, quer você tenha ou não o “www”. parte. Então, verifique isso:

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

m conterá as seguintes partes:

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

Agora confira a mesma expressão regular, mas com um URL que não comece com “www”:

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

Agora sua partida é assim:

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

Então, como você pode ver, vai fazer a coisa certa em ambos os casos.

Existe um bom plugin jQuery para analisar URLs: Purl .

Todo o material regex está escondido por dentro e você tem algo como:

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