Você pode usar as seguintes expressões regulares separadamente ou combinando-as em uma expressão OR conjunta.
ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";
ValidIpAddressRegex corresponde a endereços IP válidos e a nomes de host válidos ValidHostnameRegex . Dependendo do idioma que você usa, \ pode ter que ser escapado com \.
ValidHostnameRegex é válido conforme RFC 1123 . Originalmente, o RFC 952 especificava que os segmentos de nome de host não podiam iniciar com um dígito.
http://en.wikipedia.org/wiki/Hostname
A especificação original de nomes de host no RFC 952 exigia que os rótulos não pudessem começar com um dígito ou hífen e não deveriam terminar com um hífen. No entanto, uma especificação subsequente ( RFC 1123 ) permitiu que os rótulos de nome de host iniciassem com dígitos.
Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";
éxämplè.com
=xn--xmpl-loa1ab.com
) e depois validados.123.456.789.0
e diz que é um nome de host válido.A regex do nome do host do smink não observa a limitação no comprimento dos rótulos individuais em um nome do host. Cada rótulo em um nome de host válido pode ter no máximo 63 octetos.
Observe que a barra invertida no final da primeira linha (acima) é a sintaxe do shell Unix para dividir a linha longa. Não faz parte da própria expressão regular.
Aqui está apenas a expressão regular sozinha em uma única linha:
Você também deve verificar separadamente se o comprimento total do nome do host não deve exceder 255 caracteres . Para mais informações, consulte o RFC-952 e o RFC-1123.
fonte
/^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}[a-z\d])?)*$/i
Para corresponder a um endereço IP válido, use o seguinte regex:
ao invés de:
Explicação
Muitos mecanismos de expressão regular correspondem à primeira possibilidade na
OR
sequência. Por exemplo, tente o seguinte regex:Teste
Teste a diferença entre bom e ruim
fonte
([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*
versus([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])|[a-zA-Z0-9]))*
+
no final em vez de*
ver a falha.Parece que não consigo editar a postagem principal, então adicionarei minha resposta aqui.
Para nome do host - resposta fácil, no exemplo egrep aqui - http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html
Embora o caso não represente valores como 0 no primeiro octeto e valores maiores que 254 (endereço IP) ou 255 (máscara de rede). Talvez uma declaração if adicional ajudaria.
Quanto ao nome de host DNS legal, desde que você verifique apenas nomes de host da Internet (e não intranet), escrevi o seguinte trecho, uma mistura de shell / php, mas deve ser aplicável como qualquer expressão regular.
primeiro acesse o site da ietf, faça o download e analise uma lista de nomes de domínio legais de nível 1:
Isso deve fornecer uma boa parte do código re que verifica a legalidade dos principais nomes de domínio, como .com .org ou .ca
Em seguida, adicione a primeira parte da expressão de acordo com as diretrizes encontradas aqui - http: //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (qualquer combinação alfanumérica e símbolo '-', o traço não deve estar o começo ou o fim de um octeto.
Em seguida, junte tudo (exemplo PHP preg_match):
Você também pode adicionar uma instrução if para verificar se a string que você está verificando tem menos de 256 caracteres - http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html
fonte
Vale a pena notar que existem bibliotecas para a maioria dos idiomas que fazem isso por você, geralmente incorporadas à biblioteca padrão. E é provável que essas bibliotecas sejam atualizadas com muito mais frequência do que o código que você copiou de uma resposta do Stack Overflow há quatro anos e esqueceu. E é claro que eles também geralmente analisam o endereço de alguma forma utilizável, em vez de apenas fazer uma correspondência com vários grupos.
Por exemplo, detectando e analisando IPv4 em (POSIX) C:
Obviamente, essas funções não funcionarão se você estiver tentando, por exemplo, encontrar todos os endereços válidos em uma mensagem de bate-papo - mas mesmo assim, pode ser mais fácil usar um regex simples, mas excessivamente zeloso, para encontrar possíveis correspondências e usar o biblioteca para analisá-los.
Por exemplo, em Python:
fonte
fonte
Eu acho que este é o melhor regex de validação de IP. por favor, verifique uma vez !!!
fonte
fonte
Isso funciona para endereços IP válidos:
fonte
fonte
Aqui está um regex que eu usei no Ant para obter um IP ou nome de host do proxy fora de ANT_OPTS. Isso foi usado para obter o IP do proxy para que eu pudesse executar um teste Ant "isreachable" antes de configurar um proxy para uma JVM bifurcada.
fonte
\w
aí, ele não captura o IP, apenas o nome do host em determinadas situações.Achei que isso funciona muito bem para endereços IP. Ele valida como a resposta principal, mas também garante que o ip seja isolado, para que nenhum texto ou mais números / decimais sejam anteriores ou anteriores ao ip.
fonte
este re é usado apenas para esta validação de tipo
funcionará apenas se http://www.kk.com http://www.kk.co.in
não funciona para
http://www.kk.com/ http: //www.kk.co.in.kk
http://www.kk.com/dfas http://www.kk.co.in/
fonte
tente isto:
funciona no meu caso.
fonte
Em relação aos endereços IP, parece que há algum debate sobre a inclusão de zeros à esquerda. Era uma vez a prática comum e geralmente é aceita, então eu argumentaria que elas deveriam ser sinalizadas como válidas, independentemente da preferência atual. Há também alguma ambiguidade sobre se o texto antes e depois da string deve ser validado e, novamente, acho que deveria. 1.2.3.4 é um IP válido, mas 1.2.3.4.5 não é e nem a parte 1.2.3.4 nem a parte 2.3.4.5 devem resultar em uma correspondência. Algumas das preocupações podem ser tratadas com esta expressão:
A parte lamentável aqui é o fato de que a parte regex que valida um octeto é repetida como é verdade em muitas soluções oferecidas. Embora isso seja melhor do que para instâncias do padrão, a repetição pode ser totalmente eliminada se as sub-rotinas forem suportadas no regex que está sendo usado. O próximo exemplo habilita essas funções com a
-P
opção degrep
e também tira proveito da funcionalidade lookahead e lookbehind. (O nome da função que selecionei é 'o' para o octeto. Eu poderia ter usado 'octeto' como o nome, mas queria ser conciso.)A manipulação do ponto pode, na verdade, criar um falso negativo se os endereços IP estiverem em um arquivo com texto na forma de frases, pois o período pode ser seguido sem fazer parte da notação pontilhada. Uma variante do acima consertaria isso:
fonte
fonte
A nova estrutura de rede possui inicializadores disponíveis para struct IPv4Address e struct IPv6Address, que lidam com a parte do endereço IP com muita facilidade. Fazer isso no IPv6 com uma regex é difícil com todas as regras de encurtamento.
Infelizmente não tenho uma resposta elegante para o nome do host.
Observe que a estrutura de rede é recente, portanto, pode forçar a compilação de versões recentes do sistema operacional.
fonte
que tal agora?
fonte
no php:
filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'
fonte
Verificando nomes de host como ... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in etc.,
fonte
inet_aton
é bom o suficiente.Pensei nesse padrão simples de correspondência de expressões regulares para correspondência de endereços IP \ d + [.] \ D + [.] \ D + [.] \ D +
fonte
^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
e, claro, essa não será a maneira correta. Se você possui um idioma para escrever um script, com certeza terá acesso às funções de rede. A melhor maneira de verificar um IP REAL é dizer ao sistema para converter e fazer o ip no formato correto e, em seguida, verifique se é verdadeiro / falso. No caso de Python eu usosocket.inet_aton(ip)
. Caso de PHP vc preciseinet_aton($ip)
.