Padrão de URL de correspondência regular

1

Estou tentando criar um padrão de expressão regular que corresponda a qualquer domínio nesse formato:

example.com

mas não isso:

subdominio.example.com

Atualmente, ele precisa apenas cobrir os principais TLDs (com, net, org), mas eu gostaria que fosse capaz de lidar com outros (como co.uk, com.br, etc.) para flexibilidade.

Até agora eu tenho isso, mas definitivamente precisa de algum trabalho:

^[^w].*\.[a-z]{3}.*$

Poderia um ninja regular me ajudar?

EDITAR: O regex será usado no PHP, e nunca há um protocolo no início da string para corresponder devido à configuração do script. Eu teria que cavar mais no script para obter mais detalhes sobre por que isso é verdade, mas eu acredito que é apenas pegar o nome do host da variável PHP $ _SERVER.

EDIT 2: Talvez isso funcione para cobrir qualquer coisa, exceto um período até algo que corresponda a .xyz ou .xyz.ab ou .xyz.abc ^[^.]+(\.[^.]{3}|\.[^.]{2,3}\.[^.]{2,3}).*$

EDIT 3: Eu tenho o padrão quase concluído: updated below (o php requer / e / no começo e no fim) Alguém pode cutucar buracos na implementação? Parece estar funcionando como esperado.

EDIT 4: Aqui é onde eu estou atualmente: updated below Ele corresponde quase ao que eu quero, embora exija o / no início do caminho do arquivo, então example.com não corresponde, enquanto example.com/test faz. Não consigo compará-lo com example.com sem corresponder ao ".exa" em "www.example.com".

EDIT 5: Ok, nós temos um vencedor: /^[^.]+((\.[^.\/]{1,3}\b){1,2}).*$/

Jogos:
example.com
example.co.uk
example.com/test.php?a=b
example.co.uk/test.php?a=b
123.com
1234.com
www.123.com (corresponde a todas as URLs com domínios com menos de 4 caracteres)

não corresponde:
www.example.com
www.example.co.uk
www.example.com/test.php?a=b
www.example.co.uk/test.php?a=b
test.example.com/test.php?a=b
test.example.co.uk/test.php?a=b
www.1234.com

    
por MikeSmitty 24.02.2011 / 00:28

2 respostas

2

Qual idioma você está usando?

Em geral, parece que você quer algo que corresponda aos aspectos básicos de um domínio, excluindo a possibilidade de um período diferente daquele que delineia o arquivo .tld.

# link ^.] + \. (com | net | org) #i

Se você não quer combinar o protocal, talvez algo assim.

# [^. ] + \. (com | net | org) #i

O seu desejo de lidar com TLDs com várias partes vai estragar tudo, você precisará manter uma lista manual de todas as que deseja combinar. A única alternativa é fazer pesquisas de DNS para determinar o tipo de listagem. Realmente não existe outra maneira de extrair dados de subdomínio do domínio com uma expressão regular, porque, por direitos, os domínios são, na verdade, apenas subdomínios de algum TLD (domínio de nível superior).

Editar: Para combinar os TLDs, considerando que eles têm menos de quatro caracteres, você pode brincar com algo assim. Você vai ter que descobrir o que constitui o início e o fim de uma partida. Você está exigindo a presença de um protocal? Isso está em um parágrafo em que alguém poderia digitar um período fora de contexto? Se você der mais detalhes sobre os parâmetros, poderemos fornecer uma solução mais precisa.

[^.]+((\.[^.]{0,3})+)
    
por 24.02.2011 / 00:43
1

Um dos melhores recursos na rede para isso é regexlib:

link

link

Existem inúmeros exemplos de protocolos e TLDs ou querystring completos para validade

    
por 24.02.2011 / 00:46