Regex de URL http e https
Regex para URLs http e https com domínio, porta opcional e caminho, útil para achar endereços em texto. Não cobre todos os casos da especificação de URL.
O padrão
https?://(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,}(?::\d{2,5})?(?:/[^\s]*)?
Flags: nenhuma. Sem âncoras: para validar um campo inteiro use ^(?:padrão)$.
Teste na hora
| Linha | Resultado |
|---|
Tudo roda no seu navegador; nada do que você digita é enviado.
Exemplos
Casam
https://exemplo.com.brhttp://www.exemplo.com:8080/a/b?x=1#topohttps://sub.dominio.exemplo.org/paginahttp://exemplo.io/
Não casam
ftp://exemplo.comhttps://exemplohttps://exemplo .comwww.exemplo.comhttps://.com
Como funciona, por partes
https?://: Esquema: http ou https. O s é opcional e as barras são literais.(?:[A-Za-z0-9-]+\.)+: Um ou mais rótulos de domínio, cada um terminado em ponto, como www. e exemplo. O sinal de mais exige ao menos um rótulo.[A-Za-z]{2,}: A terminação do domínio, com duas ou mais letras, como com, br ou app.(?::\d{2,5})?: Porta opcional: dois pontos e de dois a cinco dígitos, como :8080.(?:/[^\s]*)?: Caminho, parâmetros e fragmento opcionais: barra seguida de qualquer caractere que não seja espaço. Cobre /a/b?x=1#topo.
Armadilhas
- Endereços como http://localhost:3000 e IPs numéricos não casam, porque o padrão exige uma terminação com letras. Se precisar deles, adicione alternativas específicas.
- Ao extrair URLs de texto corrido, o final da frase atrapalha: em "veja https://exemplo.com/a." o ponto final pode ser engolido pelo caminho. Remova pontuação do fim depois de achar a URL.
- Passar no regex não torna a URL segura. Links de phishing seguem esse formato. Não use este padrão como filtro de segurança nem abra links só porque o formato é válido.
- Domínios com acentos (internacionalizados) e esquemas como mailto: ou ftp: ficam de fora. Para análise rigorosa de URLs, o objeto URL do JavaScript é mais confiável que um regex.
Código pronto
JavaScript
const re = new RegExp("^(?:https?://(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?::\\d{2,5})?(?:/[^\\s]*)?)$");
console.log(re.test(texto.trim()));
Python
import re
re_url_http = re.compile(r"https?://(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,}(?::[0-9]{2,5})?(?:/[^\s]*)?")
print(bool(re_url_http.fullmatch(texto.strip())))
C#
using System.Text.RegularExpressions;
var re = new Regex(@"^(?:https?://(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,}(?::[0-9]{2,5})?(?:/[^\s]*)?)\z");
bool ok = re.IsMatch(texto.Trim());
Perguntas frequentes
Melhor usar new URL() ou regex?
Para validar uma URL isolada, new URL() é mais correto. O regex é melhor para achar URLs dentro de textos longos e para triagem rápida de formato.
Como aceitar só https?
Troque https? por https. Em formulários que enviam dados sensíveis, aceitar apenas https é uma boa regra.
O padrão funciona com URLs sem www?
Funciona. O www é só mais um rótulo de domínio; https://exemplo.com casa do mesmo jeito.
Como achar todas as URLs de um texto longo?
Use o padrão sem âncoras e com a flag g, e percorra os resultados com matchAll. Depois de cada ocorrência, retire pontuação final como ponto, vírgula e parêntese de fechamento, que o padrão pode ter incluído no caminho.
O padrão aceita parâmetros de consulta?
Aceita. Tudo o que vem depois da primeira barra e não é espaço entra no caminho, incluindo o ponto de interrogação, os parâmetros com e comercial e o fragmento depois do jogo da velha. O regex não separa essas partes; para isso, leia a URL com o objeto URL do JavaScript e use as propriedades pathname, searchParams e hash.
Como tratar links que o usuário digita sem o esquema?
Quando a pessoa digita só www.exemplo.com, o padrão recusa. Uma saída é acrescentar https:// na frente de textos que começam com www., e só então testar. Faça isso conscientemente: assumir https por conta própria pode apontar para um site sem certificado.