Padrão de expressão regular para corresponder ao URL com ou sem http: // www

Eu não sou muito bom em expressões regulares.

Eu tenho usado muito código de framework até hoje, mas não consigo encontrar um que seja compatível com um URL como http://www.example.com/etcetc mas também é capaz de capturar algo como www.example.com/etcetc e example.com/etcetc .

Qualquer ajuda seria ótimo. Obrigado rapazes!

Para corresponder a todos os tipos de URLs, o código a seguir deve funcionar:

  

Em seguida, a maneira correta de verificar o regex é a seguinte:

  

Courtesy: Comentários feitos por splattermania no manual PHP: http://php.net/manual/en/function.preg-match.php

RegEx Demo em regex101

Isso funciona para mim em todos os casos que eu testei:

 $url_pattern = '/((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/'; 

Testes:

 http://test.test-75.1474.stackoverflow.com/ https://www.stackoverflow.com https://www.stackoverflow.com/ http://wwww.stackoverflow.com/ http://wwww.stackoverflow.com http://test.test-75.1474.stackoverflow.com/ http://www.stackoverflow.com http://www.stackoverflow.com/ stackoverflow.com/ stackoverflow.com http://www.example.com/etcetc www.example.com/etcetc example.com/etcetc user:pass@example.com/etcetc example.com/etcetc?query=aasd example.com/etcetc?query=aasd&dest=asds http://stackoverflow.com/questions/6427530/regular-expression-pattern-to-match-url-with-or-without-http-www http://stackoverflow.com/questions/6427530/regular-expression-pattern-to-match-url-with-or-without-http-www/ 

Cada URL válido da internet tem pelo menos um ponto, então o padrão acima simplesmente tentará encontrar pelo menos duas cadeias encadeadas por um ponto, e tem caracteres válidos que o URL pode ter.

Tente isto:

/^http:\/\/|(www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(:[0-9]{1,5})?(\/.*)?$/

Funciona exatamente como as pessoas querem.

Leva com ou sem http:// , https:// e www .

Você pode usar um ponto de interrogação após uma expressão regular para torná-lo condicional, assim você desejaria usar:

 http:\/\/(www\.)? 

Isso corresponderá a qualquer coisa que tenha http: // www . ou http: // (sem www)

O que você poderia fazer é apenas usar um método de substituição para remover o acima, obtendo assim o domínio. Depende do que você precisa para o domínio.

Eu sei que este é um post antigo, mas apenas contribuindo com a minha solução, que é uma combinação de algumas das respostas que encontrei aqui no stackoverflow.

 /(https?://)?((?:(\w+-)*\w+)\.)+(?:[az]{2})(\/?\w?-?=?_?\??&?)+[\.]?([a-z0-9\?=&_\-%#])?/g 

Corresponde a something.com , http(s):// ou www . Não corresponde a outros [something]:// URLs, mas para o meu propósito não é necessário.

O regex corresponde por exemplo:

 http://foo.co.uk/ www.regex.com/foo.html?q=bar$some=thi-ng,regex regex.foo.com/blog 

Tente algo assim:

 .*([\w-]+\.)+[az]{2,5}(/[\w-]+)* 

Tente isso

 $url_reg = /(ftp|https?):\/\/(\w+:?\w*@)?(\S+)(:[0-9]+)?(\/([\w#!:.?+=&%@!\/-])?)?/; 

Se não precisa ser regex, você sempre pode usar os filtros Validate que estão no PHP.

 filter_var('http://example.com', FILTER_VALIDATE_URL); 

filter_var ( misturado $ variável [, int $ filter = FILTER_DEFAULT [, misturado $ opções]]);

Tipos de Filtros

Validar Filtros