Dado o URL (linha única):
http://test.example.com/dir/subdir/file.html
Como posso extrair as seguintes partes usando expressões regulares:
- O subdomínio (teste)
- O domínio (exemplo.com)
- O caminho sem o arquivo (/ dir / subdir /)
- O arquivo (file.html)
- O caminho com o arquivo (/dir/subdir/file.html)
- O URL sem o caminho ( http://test.example.com )
- (adicione qualquer outro que considere útil)
A regex deve funcionar corretamente, mesmo se eu inserir o seguinte URL:
http://example.example.com/example/example/example.html
CrackUrl
. Se essa função existir, use-a, é quase garantido que é mais confiável e mais eficiente do que qualquer código criado manualmente.Respostas:
você pode analisar ainda mais o host (delimitado por '.') com bastante facilidade.
O que eu faria é usar algo assim:
a análise adicional 'o resto' será o mais específica possível. Fazer isso em um regex é, bem, um pouco louco.
fonte
(.*)?
como a estrela Kleene já aceita 0 ou mais, a?
parte (0 ou 1) a confunde. Corrigi-o mudando(.*)?
para(.+)?
. Você também pode simplesmente remover o?
http://www.example.com:8080/....
Aqui vai:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?
code
você mostra este código em ação no pythex.orgSei que estou atrasado para a festa, mas existe uma maneira simples de permitir que o navegador analise um URL para você sem uma regex:
fonte
http://
, para exibição correta das propriedades de protocolo, host e nome de host. Caso contrário, o início do URL até a primeira barra vai para a propriedade de protocolo.var url = new URL(someUrl)
Estou alguns anos atrasado para a festa, mas estou surpreso que ninguém tenha mencionado que a especificação do Uniform Resource Identifier possui uma seção sobre a análise de URIs com uma expressão regular . A expressão regular, escrita por Berners-Lee, et al., É:
Pelo que vale, descobri que tinha que escapar das barras no JavaScript:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
fonte
1
:: Isso lida corretamente com outros protocolos, comoftp://
emailto://
.2
: Isso lida corretamente comusername
epassword
. Esses campos opcionais são separados por dois pontos, assim como o nome do host e a porta, e ele disparará na maioria das outras expressões regulares que eu já vi. @ RémyDAVID A string de consulta também não é analisada normalmente pelolocation
objeto do navegador . Se você precisar analisar a string de consulta, dê uma olhada na minha pequena biblioteca para isso: uqs .user:[email protected]
- RFC 3986 diz:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
Achei que a resposta mais votada (resposta do hometoast) não funciona perfeitamente para mim. Dois problemas:
A seguir está uma versão modificada:
A posição das peças é a seguinte:
Edição publicada por um usuário anon:
fonte
http://www.example.com
ou se o caminho tiver um único caracterehttp://www.example.com/a
.Eu precisava de uma expressão regular para corresponder a todos os URLs e fiz este:
Corresponde a todos os URLs, qualquer protocolo, até URLs como
O resultado (em JavaScript) fica assim:
Um URL como
se parece com isso:
fonte
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Eu estava tentando resolver isso em javascript, que deve ser tratado por:
desde que (no Chrome, pelo menos) ele analisa:
No entanto, este não é um navegador cruzado ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), então juntei isso para extrair as mesmas partes acima:
O crédito para este regex vai para https://gist.github.com/rpflorence que postou este jsperf http://jsperf.com/url-parsing (originalmente encontrado aqui: https://gist.github.com/jlong/2428561 # comment-310066 ), que veio com o regex em que originalmente era baseado.
As peças estão nesta ordem:
Há também uma pequena biblioteca que a envolve e fornece parâmetros de consulta:
https://github.com/sadams/lite-url (também disponível no caramanchão)
Se você tiver uma melhoria, crie uma solicitação de recebimento com mais testes e aceitarei e mesclarei agradecimentos.
fonte
http://test1.dev.mydomain.com/
por exemplo, seria retiradotest1.dev.
.Propor uma solução muito mais legível (em Python, mas se aplica a qualquer regex):
Impressões:
fonte
subdomínio e domínio são difíceis porque o subdomínio pode ter várias partes, assim como o domínio de nível superior, http://sub1.sub2.domain.co.uk/
(Markdown não é muito amigável para regexes)
fonte
(http(s?)://[^/]+/)
para também pegar httpsEsta versão aprimorada deve funcionar com tanta confiabilidade quanto um analisador.
fonte
Tente o seguinte:
Ele suporta HTTP / FTP, subdomínios, pastas, arquivos etc.
Encontrei-o em uma rápida pesquisa no Google:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
fonte
Da minha resposta sobre uma pergunta semelhante . Funciona melhor do que alguns dos outros mencionados porque tinham alguns bugs (como não oferecer suporte a nome de usuário / senha, não oferecer suporte a nomes de arquivos de caractere único, identificadores de fragmentos sendo quebrados).
fonte
Você pode obter todos os http / https, host, porta, caminho e consulta usando o objeto Uri no .NET. apenas a tarefa difícil é dividir o host em subdomínio, nome de domínio e TLD.
Não existe um padrão para fazê-lo e não pode ser simplesmente usar a análise de string ou o RegEx para produzir o resultado correto. No começo, estou usando a função RegEx, mas nem todo URL pode analisar o subdomínio corretamente. A maneira prática é usar uma lista de TLDs. Depois que um TLD para um URL é definido, a parte esquerda é domínio e o restante é subdomínio.
No entanto, a lista precisa mantê-la, pois novos TLDs são possíveis. O momento atual que sei é publicsuffix.org manter a lista mais recente e você pode usar as ferramentas de domínio-analisador de código do google para analisar a lista de sufixos públicos e obter o subdomínio, domínio e TLD facilmente usando o objeto DomainName: domainName.SubDomain, domainName .Domain e domainName.TLD.
Essas respostas também são úteis: Obter o subdomínio de um URL
CaLLMeLaNN
fonte
Aqui está um que está completo e não depende de nenhum protocolo.
Impressões
fonte
Nenhuma das opções acima funcionou para mim. Aqui está o que eu acabei usando:
fonte
Eu gosto da regex publicada em "Javascript: The Good Parts". Não é muito curto nem muito complexo. Esta página no github também possui o código JavaScript que a utiliza. Mas pode ser adaptado para qualquer idioma. https://gist.github.com/voodooGQ/4057330
fonte
Java oferece uma classe de URL que fará isso. Objetos de URL de consulta.
Em uma nota lateral, o PHP oferece parse_url () .
fonte
Eu recomendaria não usar regex. Uma chamada de API como WinHttpCrackUrl () é menos propensa a erros.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
fonte
Eu tentei alguns deles que não atendiam às minhas necessidades, especialmente os mais votados que não capturavam um URL sem um caminho ( http://example.com/ )
também a falta de nomes de grupos tornou inutilizável em ansible (ou talvez minhas habilidades jinja2 estejam faltando).
então esta é minha versão ligeiramente modificada, com a fonte sendo a versão mais votada aqui:
fonte
Usando http://www.fileformat.info/tool/regex.htm, o regex do hometoast funciona muito bem.
Mas aqui está o acordo: quero usar diferentes padrões de regex em diferentes situações do meu programa.
Por exemplo, eu tenho esse URL e uma enumeração que lista todos os URLs suportados no meu programa. Cada objeto na enumeração possui um método getRegexPattern que retorna o padrão de expressão regular que será usado para comparar com uma URL. Se o padrão específico de regex retornar true, eu sei que esse URL é suportado pelo meu programa. Portanto, cada enumeração possui seu próprio regex, dependendo de onde deve procurar dentro da URL.
A sugestão do Hometoast é ótima, mas no meu caso, acho que não ajudaria (a menos que copie e cole o mesmo regex em todas as enumerações).
É por isso que eu queria que a resposta desse regex para cada situação separadamente. Embora +1 para hometoast. ;)
fonte
Sei que você está afirmando que não tem linguagem, mas pode nos dizer o que está usando, para sabermos quais recursos de regex você possui?
Se você possui os recursos para correspondências que não capturam, é possível modificar a expressão do hometoast para que as subexpressões que você não está interessado em capturar sejam configuradas da seguinte forma:
(?:SOMESTUFF)
Você ainda teria que copiar e colar (e modificar levemente) o Regex em vários lugares, mas isso faz sentido - você não está apenas verificando se a subexpressão existe, mas se existe como parte de uma URL . Usar o modificador de não captura para subexpressões pode fornecer o que você precisa e nada mais, o que, se eu estiver lendo você corretamente, é o que você deseja.
Assim como uma nota pequena e pequena, a expressão do hometoast não precisa colocar colchetes ao redor do 's' para 'https', pois ele tem apenas um caractere. Os quantificadores quantificam o único caractere (ou classe ou subexpressão de caracteres) que os precede diretamente. Assim:
https?
corresponderia a 'http' ou 'https' muito bem.
fonte
regexp para obter o caminho da URL sem o arquivo
url = ' http: // domínio / dir1 / dir2 / algum arquivo' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) + (? = /)) ? /? (?: [^ /] +)? $ / i) .to_s
Pode ser útil para adicionar um caminho relativo a este URL.
fonte
O regex para fazer a análise completa é bastante horrendo. Incluí referências de referência nomeadas para legibilidade e dividi cada parte em linhas separadas, mas ainda assim é assim:
O que exige que seja tão detalhado é que, exceto pelo protocolo ou pela porta, qualquer uma das partes pode conter entidades HTML, o que torna bastante complicado o delineamento do fragmento. Portanto, nos últimos casos - host, caminho, arquivo, string de consulta e fragmento, permitimos qualquer entidade html ou caractere que não seja um
?
ou#
. O regex para uma entidade html se parece com isso:Quando isso é extraído (usei uma sintaxe de bigode para representá-lo), ele se torna um pouco mais legível:
No JavaScript, é claro, você não pode usar referências anteriores nomeadas, portanto, a regex se torna
e em cada correspondência, o protocolo é
\1
o host\2
, a porta\3
, o caminho\4
, o arquivo\5
, a cadeia de consulta\6
e o fragmento\7
.fonte
fonte
Eu tentei este regex para analisar partições de URL:
URL:
https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2
Partidas:
fonte
Fornecerá a seguinte saída:
1: https: //
2: www.thomas-bayer.com
3: /
4: axis2 / services / BLZService? Wsdl
Se você alterar o URL para
String s = " https: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; a saída será a seguinte:
1: https: //
2: www.thomas-bayer.com
3:?
4: wsdl = qwerwer & ttt = 888
aproveite ..
Yosi Lev
fonte