Como posso verificar se uma determinada string é um endereço de URL válido?
Meu conhecimento de expressões regulares é básico e não me permite escolher entre as centenas de expressões regulares que já vi na web.
regex
url
language-agnostic
Vitor Silva
fonte
fonte
Respostas:
Eu escrevi meu padrão de URL (atualmente IRI, internacionalizado) para estar em conformidade com a RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ). Estes estão na sintaxe PCRE.
Para IRIs absolutas (internacionalizadas):
Para também permitir IRIs relativos:
Como eles foram compilados (em PHP):
Editar em 7 de março de 2011: Devido à maneira como o PHP lida com barras invertidas nas seqüências de caracteres citadas, elas são inutilizáveis por padrão. Você precisará escapar duas barras invertidas, exceto onde a barra invertida tem um significado especial em regex. Você pode fazer isso desta maneira:
fonte
http://com
é um URL válido.http://localhost
é, por que não seriam outras palavras? Você está certo de que ou
modificador é necessário no PHP. Quero deixar claro que, embora eu os tenha gerado com PHP, eles não são específicos para PHP.Acabei de escrever uma postagem no blog para uma ótima solução para reconhecer URLs nos formatos mais usados, como:
www.google.com
http://www.google.com
mailto:[email protected]
[email protected]
www.url-with-querystring.com/?url=has-querystring
A expressão regular usada é:
fonte
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
emargin:3px
Qual plataforma? Se estiver usando o .NET, use
System.Uri.TryCreate
, não um regex.Por exemplo:
(Obrigado a @Yoshi pela dica sobre
javascript:
)fonte
javascript: alert('blah')
. Você precisa fazer uma validação adicional no Uri.Scheme para confirmar que o protocolo http / https / ftp está sendo usado; caso contrário, se esse URL for inserido no HTML das páginas ASP.NET como um link, seus usuários estarão vulneráveis a ataques XSS .Uri.IsWellFormedUriString()
Aqui está o que o RegexBuddy usa.
Corresponde a estes abaixo (dentro das
** **
marcas):Você pode fazer o download do RegexBuddy em http://www.regexbuddy.com/download.html .
fonte
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
Com relação ao post de resposta da pálpebra que diz "Isso é baseado na minha leitura da especificação URI.": Graças à pálpebra, a sua é a solução perfeita que eu procurei, pois é baseada na especificação da URI! Excelente trabalho. :)
Eu tive que fazer duas alterações. O primeiro a fazer com que o regexp corresponda aos URLs de endereço IP corretamente no PHP (v5.2.10) com a função preg_match ().
Eu tive que adicionar mais um par de parênteses à linha acima de "Endereço IP" ao redor dos tubos:
Não sei por que.
Também reduzi o tamanho mínimo do domínio de nível superior de 3 para 2 letras para dar suporte a .co.uk e similares.
Código final:
Esta versão modificada não foi verificada com relação à especificação de URI, portanto, não posso garantir sua conformidade; foi alterada para manipular URLs em ambientes de rede local e TLDs de dois dígitos, além de outros tipos de URL da Web, e para funcionar melhor no PHP configuração que eu uso.
Como código PHP :
Aqui está um programa de teste em PHP que valida uma variedade de URLs usando o regex:
Mais uma vez obrigado à pálpebra pela regex!
fonte
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
por')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
". Fiz a edição relevante com base neste comentário./^(https?|ftp):
(protocolo) Por que você não permite protocolos como dados, arquivo, svn, dc ++, ímã, skype ou qualquer outro suportado por um navegador com o plug-in ou um servidor correspondente?Mathias Bynens tem um ótimo artigo sobre a melhor comparação entre muitas expressões regulares: Em busca da regex de validação de URL perfeita
O melhor postado é um pouco longo, mas corresponde a praticamente qualquer coisa que você possa jogar nele.
Versão JavaScript
Versão do PHP
fonte
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
A postagem Obtendo partes de um URL (Regex) discute a análise de um URL para identificar seus vários componentes. Se você deseja verificar se um URL está bem formado, deve ser suficiente para suas necessidades.
Se você precisar verificar se é realmente válido, terá que tentar acessar o que está do outro lado.
Em geral, porém, você provavelmente usaria uma função fornecida pela estrutura ou outra biblioteca. Muitas plataformas incluem funções que analisam URLs. Por exemplo, existe o módulo urlparse do Python e, no .NET, você pode usar o construtor da classe System.Uri como um meio de validar a URL.
fonte
Pode não ser um trabalho para expressões regulares, mas para ferramentas existentes no idioma de sua escolha. Você provavelmente deseja usar o código existente que já foi gravado, testado e depurado.
No PHP, use a
parse_url
funçãoPerl:
URI
módulo .Ruby:
URI
módulo ..NET: classe 'Uri'
Regexes não são uma varinha mágica que você acena em todos os problemas que envolvem seqüências de caracteres.
fonte
java.net.URL
.Analisador de referência de URI não validado
Para fins de referência, aqui está a especificação IETF: ( TXT | HTML ). Em particular, o Apêndice B. Analisando uma Referência de URI com uma Expressão Regular demonstra como analisar um regex válido . Isso é descrito como,
Aqui está o regex que eles fornecem:
Como alguém disse, provavelmente é melhor deixar isso para uma lib / framework que você já está usando.
fonte
Isso corresponderá a todos os URLs
... incluindo subdomínios e as novas extensões de nome de domínio de nível superior, como. museu ,. academia ,. base etc., que pode ter até 63 caracteres (não apenas .com , .net ,. info etc.)
Como hoje, o comprimento máximo da extensão de nome de domínio de nível superior disponível é de 13 caracteres, como. internacional , você pode alterar o número 63 na expressão para 13 para evitar que alguém o use incorretamente.
como javascript
Artigo da Wikipedia: lista de todos os domínios de nível superior da Internet
fonte
t.co
. Como você o ajustaria para lidar com esses casos?A melhor expressão regular para URL para mim seria:
fonte
(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
\w
- los\p{L}
no mínimo.([\d\w][-\d\w]{0,253}[\d\w]\.)+
para([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(adicione um ponto de interrogação perto do final do mesmo)Corresponde a http://site.com/dir/file.php?var=moo | ftp: // usuário: [email protected]: 21 / file / dir
Site.com não correspondências | http://site.com/dir//
fonte
http://www.goo gle.com
corresponderá.Jogos http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
fonte
Não consegui encontrar o regex que estava procurando, então modifiquei um regex para atender aos meus requisitos e, aparentemente, parece funcionar bem agora. Meus requisitos eram:
Aqui o que eu vim com, qualquer sugestão é apreciada:
fonte
Se você realmente procura a melhor correspondência, provavelmente a encontra em " Uma boa expressão regular de URL? ".
Mas um regex que realmente corresponde a todos os domínios possíveis e permite que tudo o que é permitido de acordo com as RFCs seja terrivelmente longo e ilegível, confie em mim ;-)
fonte
Eu tenho trabalhado em um artigo detalhado discutindo a validação de URI usando expressões regulares. É baseado no RFC3986.
Validação de URI de expressão regular
Embora o artigo ainda não esteja completo, criei uma função PHP que faz um bom trabalho de validação de URLs HTTP e FTP. Aqui está a versão atual:
Esta função utiliza duas regexes; um para corresponder a um subconjunto de URIs genéricos válidos (absolutos com um host não vazio) e um segundo para validar o nome do host "partes separadas por pontos" do DNS. Embora atualmente essa função valide apenas esquemas HTTP e FTP, ela está estruturada de forma que possa ser facilmente estendida para manipular outros esquemas.
fonte
eu escrevi uma versão pequena que você pode executar
corresponde aos seguintes URLs (o que é bom o suficiente para mim)
http://google.com
http://google.com/help.php
http://google.com/help.php?a=5
http://www.google.com
http://www.google.com/help.php
http://www.google.com?a=5
google.com?a=5
google.com/help.php
google.com/help.php?a=5
http://www.m.google.com/help.php?a=5 (e todas as suas permutações)
www.m.google.com/help.php?a=5 (e todas as suas permutações)
m.google.com/help.php?a=5 (e todas as suas permutações)
O importante para quaisquer URLs que não começam com http ou www é que eles devem incluir um / ou?
Aposto que isso pode ser ajustado um pouco mais, mas faz o trabalho muito bom por ser tão pequeno e compacto ... porque você pode dividi-lo em 3:
encontre qualquer coisa que comece com http: https?: // w {0,3} \ w *?. \ w {2,3} \ S *
encontre qualquer coisa que comece com www: www. \ w *?. \ w {2,3} \ S *
ou encontrar algo que deva ter um texto, depois um ponto, pelo menos 2 letras e depois um? ou /: \ w *?. \ w {2,3} [/ \?] \ S *
fonte
-
no URL.Eu uso este regex:
Para suportar os dois:
E:
fonte
((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
Aqui está uma boa regra que abrange todos os casos possíveis: portas, parâmetros e etc
fonte
Este funciona para mim muito bem.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
fonte
Aqui está uma versão Java pronta para uso do código-fonte do Android. Este é o melhor que eu encontrei.
fonte
Aqui está um regex que fiz que extrai as diferentes partes de um URL:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(grupo 1) : extrai o protocolo([^:/\s.]+\.[^:/\s]|localhost)
(grupo 2) : extrai o nome do host(:\d+)?
(grupo 3) : extrai o número da porta((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(grupos 4 e 5) : extrai a parte do caminho([^#]+)?
(grupo 6) : extrai a parte da consulta(#[\w-]+)?
(grupo 7) : extrai a parte do hashPara cada parte do regex listado acima, você pode remover a finalização
?
para forçá-lo (ou adicionar um para torná-lo facultativo). Você também pode remover o^
no início e$
no final da regex para que ele não precise corresponder a toda a cadeia.Veja no regex101 .
Nota: esse regex não é 100% seguro e pode aceitar algumas strings que não são necessariamente URLs válidas, mas na verdade valida alguns critérios. Seu principal objetivo era extrair as diferentes partes de um URL para não validá-lo.
fonte
Para Python, este é o regex de validação de URL real usado no Django 1.5.1:
Isso faz os endereços ipv4 e ipv6, além de portas e parâmetros GET.
Encontrado no código aqui , Linha 44.
fonte
Encontrei o seguinte Regex para URLs, testado com êxito com mais de 500 URLs :
/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi
Eu sei que parece feio, mas o bom é que funciona. :)
Explicação e demonstração com 581 URLs aleatórios no regex101.
Fonte: em busca da regex de validação de URL perfeita
fonte
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
Eu tentei formular minha versão do URL. Meu requisito era capturar instâncias em uma String onde o URL possível pudesse ser cse.uom.ac.mu - observando que ele não é precedido por http nem www
fonte
ht{2}ps?
pouco entãohttps?
o que há de errado com FILTER_VALIDATE_URL puro e simples?
Eu sei que não é exatamente a pergunta, mas ele fez o trabalho para mim quando eu precisava validar os URLs, então pensei que poderia ser útil para outras pessoas que se deparam com este post procurando a mesma coisa
fonte
O seguinte RegEx funcionará:
fonte
Use este seu trabalho para mim
fonte
Por conveniência, eis um regexp de uma linha para URLs que também corresponderá ao host local, onde é mais provável que você tenha portas
.com
iguais ou semelhantes.fonte
Você não especifica qual idioma está usando. Se o PHP for, existe uma função nativa para isso:
Retorna os dados filtrados, ou FALSE se o filtro falhar.
Veja aqui >>
Espero que ajude.
fonte