Qual é uma boa expressão regular para corresponder a um URL?

Atualmente eu tenho uma checkbox de input que irá detectar o URL e analisar os dados.

Então, agora estou usando:

var urlR = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+) (?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; var url= content.match(urlR); 

O problema é que quando eu insiro uma URL como www.google.com , não está funcionando. quando entrei em http://www.google.com , está funcionando.

Eu não sou muito fluente em expressões regulares. Alguém pode me ajudar?

   

Regex se você quiser garantir que o URL comece com HTTP / HTTPS:

 https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[az]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*) 

Se você não precisar do protocolo HTTP:

 [-a-zA-Z0-9@:%._\+~#=]{2,256}\.[az]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*) 

Para experimentar, consulte http://regexr.com?37i6s ou uma versão menos restritiva http://regexr.com/3e6m0 .

Exemplo de implementação JavaScript:

 var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[az]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi; var regex = new RegExp(expression); var t = 'www.google.com'; if (t.match(regex)) { alert("Successful match"); } else { alert("No match"); } 
 (https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,}) 

Combinará os seguintes casos

  • http://www.foufos.gr
  • https://www.foufos.gr
  • http://foufos.gr
  • http://www.foufos.gr/kino
  • http://www.t.co
  • http://t.co
  • http://werer.gr
  • www.foufos.gr
  • www.mp3.com
  • www.t.co

NÃO corresponderá ao seguinte

  • www.foufos
  • http://www.foufos
  • http://foufos
  • www.mp3#.com
  • www.foufos-.gr
  • www.-foufos.gr

Verifique em rubular – nova versão

Verifique em rubular – versão antiga

Estes são os dróides que você está procurando. Isso é retirado do validator.js, que é a biblioteca que você realmente deve usar para fazer isso. Mas se você quiser rolar, quem sou eu para te parar? Se você quiser regex puro, então você pode apenas tirar a verificação de comprimento. Acho que é uma boa ideia testar o tamanho da URL, embora você realmente queira determinar a conformidade com a especificação.

  function isURL(str) { var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[az\\u00a1-\\uffff0-9]+-?)*[az\\u00a1-\\uffff0-9]+)(?:\\.(?:[az\\u00a1-\\uffff0-9]+-?)*[az\\u00a1-\\uffff0-9]+)*(?:\\.(?:[az\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$'; var url = new RegExp(urlRegex, 'i'); return str.length < 2083 && url.test(str); } 

Outra solução possível, acima da solução, falhou para mim na análise de params de string de consulta.

 var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\\/\\/(www\\.)?|www\\.){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?"); if(regex.test("http://google.com")){ alert("Successful match"); }else{ alert("No match"); } 

Nesta solução, sinta-se à vontade para modificar [-0-9A-Za-z\.@:%_\+~#= , Para corresponder ao nome do domínio / subdomínio. Nesta solução, os parâmetros da string de consulta também são atendidos.

Se você não estiver usando o RegEx , substitua a expressão \\ por \ .

Espero que isto ajude.

tente isso

 (ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))? 

Eu estava tentando montar algum JavaScript para validar um nome de domínio (ex. Google.com) e se ele valida habilitar um botão de envio. Eu pensei que eu iria compartilhar meu código para aqueles que estão procurando realizar algo semelhante. Espera um domínio sem qualquer http: // ou www. valor. O script usa uma expressão regular reduzida acima para correspondência de domínio, o que não é rigoroso em relação a TLDs falsos.

http://jsfiddle.net/nMVDS/1/

 $(function () { $('#whitelist_add').keyup(function () { if ($(this).val() == '') { //Check to see if there is any text entered //If there is no text within the input, disable the button $('.whitelistCheck').attr('disabled', 'disabled'); } else { // Domain name regular expression var regex = new RegExp("^([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?"); if (regex.test($(this).val())) { // Domain looks OK //alert("Successful match"); $('.whitelistCheck').removeAttr('disabled'); } else { // Domain is NOT OK //alert("No match"); $('.whitelistCheck').attr('disabled', 'disabled'); } } }); }); 

FORMULÁRIO HTML: