Existe uma maneira no JavaScript para verificar se uma string é um URL?
RegExes são excluídos porque o URL provavelmente é escrito como stackoverflow
; isto é, pode não ter um .com
, www
ou http
.
javascript
string
url
Bruno
fonte
fonte
http
, é por padrão sem URL.<scheme>:<scheme-specific-part>
href
elemento âncora, funciona ao chamarwindow.open(url)
, aponta para algo que realmente existe, funciona no local do navegador bar ou uma combinação dos itens acima? Você receberá respostas muito diferentes, dependendo de qual delas você gosta.Respostas:
Uma pergunta relacionada com uma resposta:
Correspondência de URL de regex Javascript
Ou este Regexp do Devshed :
fonte
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Update: de fato, ver code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. Qualquer ideia?SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group
Google Chrome (versão 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
precisará escapar duas vezes das barras invertidas - caso contrário, obterá erros como o grupo inválido .fonte
http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)
Eu coloquei uma chaleira no fogo, foi para um banheiro, liguei para minha mãe e a coisa foi feito em nenhum momento ...true
paraaaa
.isURL('12345678901234567890123')
adicione mais caracteres e isso é ainda pior.Você pode tentar usar o
URL
construtor : se não lançar, a string será uma URL válida:O termo 'URL' é definido no RFC 3886 (como URI); ele deve começar com um nome de esquema e o nome do esquema não se limita a http / https.
Exemplos notáveis:
www.google.com
URL inválido (esquema ausente)javascript:void(0)
é um URL válido, embora não seja HTTPhttp://..
é URL válida, com o anfitrião ser..
; se a resolução depende do seu DNShttps://google..com
é um URL válido, o mesmo que acimaSe você deseja verificar se uma sequência é um URL HTTP válido:
fonte
href
atributo para<a>
. URL válido deve começar com um nome de esquema , por exemplohttps://
.isValidUrl("javascript:void(0)")
http://..
Ouhttp:///a
Em vez de usar uma expressão regular, eu recomendaria fazer uso de um elemento âncora.
quando você define a
href
propriedade de umanchor
, várias outras propriedades são definidas.fonte
No entanto, se o valor
href
estiver associado a um URL inválido, o valor dessas propriedades auxiliares será a sequência vazia.Editar: como indicado nos comentários: se um URL inválido for usado, as propriedades do URL atual poderão ser substituídas.
Portanto, contanto que você não esteja transmitindo o URL da página atual, você pode fazer algo como:
fonte
a.href
for inválido,parser.host
retornará o nome do host da página em que você está atualmente, não o esperadofalse
.<a href="invalidurl">
, ele é direcionado ao seu domínio. Ele é adicionado ao final do URL atual. Portanto, o Chrome está fazendo a coisa correta, fornecendo o nome do host atual do elemento "analisador".function isValidURL(str)
: muito melhor do que usar regex! Obrigado!Estou usando a função abaixo para validar URL com ou sem
http/https
:fonte
https://sdfasdp.ppppppppppp
isto é, retornando,true
mas a minha volta, ofalse
que é esperado, eu acho.[email protected]
... deveria? Eu acho que não deveriaPara validar o URL usando javascript é mostrado abaixo
fonte
(http|https)
para(?:https?)
; b):{0,1}
para:?
; c)[0-9]
para\d
Confie em uma biblioteca: https://www.npmjs.com/package/valid-url
fonte
{
na URLMelhoria na resposta aceita ...
Permite @ símbolo no caminho, por exemplo, https://medium.com/@techytimo
fonte
Aqui está outro método.
fonte
new URL(string)
do código de Pavlo. Ambos os testes têm resultados idênticos com todos os casos extremos que testei. Eu gosto do código dele porque é mais simples e não envolve a criação de elementos, mas o seu é algumas vezes mais rápido (provavelmente porque não cria o el após o primeiro uso).(Não tenho representantes para comentar o exemplo do ValidURL ; portanto, poste isso como resposta.)
Embora o uso de URLs relativas ao protocolo não seja incentivado (a URL relativa ao protocolo ), eles são empregados algumas vezes. Para validar tal URL com uma expressão regular, a parte do protocolo pode ser opcional, por exemplo:
Como outros observaram, a expressão regular não parece ser a abordagem mais adequada para validar URLs.
fonte
isValidURL("https://[email protected]/13176")
@
. Ele não trava nos meus navegadores .Você pode usar a API nativa da URL :
fonte
Como foi observado, o regex perfeito é ilusório, mas ainda parece ser uma abordagem razoável (alternativas são testes do lado do servidor ou a nova API de URL experimental ). No entanto, as respostas de alta classificação geralmente retornam falsos para URLs comuns, mas ainda pior congelam seu aplicativo / página por minutos em uma string tão simples quanto
isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. Isso foi apontado em alguns comentários, mas provavelmente não foi um valor ruim para ser visto. Pendurar assim torna esse código inutilizável em qualquer aplicação séria. Eu acho que é devido aos conjuntos repetidos sem distinção entre maiúsculas e minúsculas no código como((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Retire o 'i' e ele não trava, mas é claro que não funcionará como desejado. Mas, mesmo com o sinalizador ignorar caso, esses testes rejeitam altos valores unicode que são permitidos.O melhor já mencionado é:
Isso vem do Github segmentio / is-url . O bom de um repositório de código é que você pode ver os testes e quaisquer problemas e também as cadeias de teste executadas nele. Há uma ramificação que permitiria que faltassem protocolos
google.com
, como , embora você provavelmente esteja fazendo muitas suposições. O repositório foi atualizado e não estou pensando em tentar manter um espelho aqui. Ele foi dividido em testes separados para evitar as repetições do RegEx que podem ser exploradas para ataques do DOS (não acho que você precise se preocupar com isso com o js do lado do cliente, mas precisa se preocupar com a suspensão da página por tanto tempo que o seu visitante sai do seu site).Já vi outro repositório que pode ser ainda melhor para o isURL em dperini / regex-weburl.js , mas é altamente complexo. Possui uma lista maior de testes de URLs válidos e inválidos. O simples acima ainda passa todos os aspectos positivos e apenas falha em bloquear alguns negativos estranhos,
http://a.b--c.de/
como também os ips especiais.Qualquer que seja a sua escolha, execute-o através desta função que adaptei dos testes no dperini / regex-weburl.js, enquanto usa o inpector das Ferramentas de desenvolvedor do navegador.
E então teste essa sequência de 'a's.
Veja esta comparação do regex isURL de Mathias Bynens para obter mais informações antes de publicar um regex aparentemente ótimo.
fonte
isURL('a'.repeat(100))
milhões de vezes / s (a mais complexa da dperini é realmente mais rápida). Algumas das respostas mais altas do formulário ([a-zA-Z] +) * levariam horas para serem concluídas uma vez. Consulte as redo RegEx para obter mais informações.Não posso comentar sobre o post que é o mais próximo # 5717133 , mas abaixo está a maneira como descobri como fazer o @ tom-gullen regex funcionar.
fonte
var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
Use validator.js
ES6
Não ES6
Você também pode ajustar o comportamento dessa função passando
options
objeto opcional como o segundo argumento deisURL
Aqui está o
options
objeto padrão :host_whitelist
ehost_blacklist
podem ser matrizes de hosts. Eles também suportam expressões regulares.fonte
Uma função que eu tenho usado para validar uma URL "string" é:
Esta função retornará um valor booleano se a string for um URL.
Exemplos:
fonte
Isso é bastante difícil de fazer com a regex pura, porque os URLs têm muitos "inconvenientes".
Por exemplo, nomes de domínio têm restrições complicadas sobre hífens:
uma. É permitido ter muitos hífens consecutivos no meio.
b. mas o primeiro e o último caractere do nome de domínio não podem ser um hífen
c. O terceiro e o quarto caracteres não podem ser hífen
Da mesma forma, o número da porta pode estar apenas no intervalo de 1-65535. É fácil verificar se você extrai a parte da porta e converte para,
int
mas é bastante difícil de verificar com uma expressão regular.Também não há uma maneira fácil de verificar extensões de domínio válidas. Alguns países têm domínios de segundo nível (como 'co.uk'), ou a extensão pode ser uma palavra longa, como '.international'. E novos TLDs são adicionados regularmente. Esse tipo de coisa só pode ser verificado em uma lista codificada. (consulte https://en.wikipedia.org/wiki/Top-level_domain )
Depois, existem URLs de ímã, endereços FTP, etc. Todos esses requisitos diferentes.
No entanto, aqui está uma função que lida com praticamente tudo, exceto:
fonte
Eu acho que usar a API de URL nativa é melhor do que um padrão de regex complexo, como sugerido pelo @pavlo. Ele tem algumas desvantagens, que podem ser corrigidas por algum código extra. Essa abordagem falha no seguinte URL válido.
Podemos adicionar o protocolo ausente antecipadamente para evitar isso. Ele também falha ao detectar o seguinte URL inválido.
Então, por que verificar o URL inteiro? podemos apenas verificar o domínio. Peguei emprestado o regex para verificar o domínio a partir daqui .
O
hostname
atributo é uma string vazia parajavascript:void(0)
, portanto, funciona para isso também, e você também pode adicionar o verificador de endereço IP. Eu gostaria de manter o máximo da API nativa e espero que ela comece a dar suporte a tudo no futuro próximo.fonte
new URL
não existem nos testes que fiz. Isso está chamando:http://142.42.1.1 //false
e bloqueando altas cadeias unicode.A pergunta solicita um método de validação para um URL, como
stackoverflow
, sem o protocolo ou qualquer ponto no nome do host. Portanto, não é uma questão de validar a sintaxe da URL, mas verificar se é uma URL válida, na verdade, chamando-a.Tentei vários métodos para saber se o URL verdadeiro existe e é passível de chamada no navegador, mas não encontrei nenhuma maneira de testar com javascript o cabeçalho de resposta da chamada:
click()
método.'GET'
é bom, mas tem várias limitações devido aCORS
políticas e não é o caso de usarajax
, pois, como o URL talvez esteja fora do domínio do meu servidor.https
protocolo e lança uma exceção ao chamar URLs não seguros.Portanto, a melhor solução que posso pensar é obter alguma ferramenta para executar
CURL
usando javascript, tentando algo parecidocurl -I <url>
. Infelizmente eu não encontrei nenhum e, de acordo com a aparência, não é possível. Eu aprecio quaisquer comentários sobre isso.Mas, no final, tenho um servidor em execução
PHP
e, como uso o Ajax para quase todas as minhas solicitações, escrevi uma função no lado do servidor para executar a solicitação de curl e retornar ao navegador.Em relação à única palavra url na pergunta 'stackoverflow', ela me levará a
https://daniserver.com.ar/stackoverflow
onde daniserver.com.ar é meu próprio domínio.fonte
foo
e assumir que é http ou https ou .com ou .es ou qualquer um dos inúmeros sufixos? Você continua jogando a pia da cozinha até conseguir uma verdade?Este parece ser um dos problemas mais difíceis do CS;)
Aqui está outra solução incompleta que funciona bem o suficiente para mim e melhor que as outras que já vi aqui. Estou usando uma entrada [type = url] para isso, a fim de oferecer suporte ao IE11, caso contrário, seria muito mais simples usar window.URL para executar a validação:
Para aceitar entradas incompletas, como "www.mydomain.com", também será válido assumindo que o protocolo seja "http" nesses casos e retornando a URL válida se o endereço for válido. Retorna false quando inválido.
Ele também suporta domínios IPv4, mas não IPv6.
fonte
No meu caso, meu único requisito é que a entrada do usuário não seja interpretada como um link relativo quando colocada no href de uma tag e as respostas aqui sejam um pouco OTT para isso ou URLs permitidos que não atendam aos meus requisitos. é o que eu vou com:
A mesma coisa poderia ser alcançada facilmente sem regex.
fonte
esta trabalhando comigo
fonte
Se você pode alterar o tipo de entrada, acho que essa solução seria muito mais fácil:
Você pode usar de maneira simples
type="url"
sua entrada e verificá-lacheckValidity()
em jsPor exemplo:
your.html
your.js
fonte
Certamente, essa não é a abordagem mais eficaz, mas é legível e fácil de formar para o que você precisar. E é mais fácil adicionar regex / complexidade a partir daqui. Então aqui está uma abordagem muito pragmática
TESTE:
fonte
Mathias Bynens compilou uma lista de regexes de URL conhecidas com URLs de teste. Há poucas razões para escrever uma nova expressão regular; basta escolher um existente que melhor lhe convier.
Mas a tabela de comparação para essas expressões regulares também mostra que é quase impossível executar a validação de URL com uma única expressão regular. Todas as expressões regulares na lista de Bynens produzem falsos positivos e falsos negativos.
Sugiro que você use um analisador de URL existente (por exemplo,
new URL('http://www.example.com/')
em JavaScript) e aplique as verificações que deseja executar na forma analisada e normalizada do resp. seus componentes. O uso daURL
interface JavaScript tem o benefício adicional de que ele aceitará apenas os URLs realmente aceitos pelo navegador.Você também deve ter em mente que os URLs tecnicamente incorretos ainda podem funcionar. Por exemplo
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
todos têm uma parte hostname inválida, mas cada navegador eu sei que vai tentar abri-los sem queixas, e quando você especificar endereços IP para esses nomes inválidos em/etc/hosts/
tais URLs vai mesmo trabalhar, mas apenas no seu computador.Portanto, a questão não é tanto se um URL é válido, mas quais URLs funcionam e devem ser permitidos em um contexto específico.
Se você deseja fazer a validação de URL, há muitos detalhes e casos extremos fáceis de ignorar:
http://user:[email protected]/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
definitivamente não seja mais suficiente.co.uk
muitos outros).Qual dessas limitações e regras se aplica é uma questão de requisitos e gostos do projeto.
Recentemente, escrevi um validador de URL para um aplicativo Web adequado para URLs fornecidos pelo usuário em fóruns, redes sociais ou similares. Sinta-se à vontade para usá-lo como base para o seu:
Também escrevi uma postagem no blog Os detalhes sangrentos da validação de URLs com informações mais detalhadas.
fonte
Altero a função para Match +, faça uma alteração aqui com as barras e seu trabalho: (http: // e https)
fonte
Aqui está apenas uma verificação muito simples para garantir que haja um protocolo válido e a extensão do domínio deve ter dois ou mais caracteres.
fonte
Se você também precisar oferecer suporte
https://localhost:3000
, use esta versão modificada do regex do [Devshed].fonte
Existem alguns testes usando o construtor de URL que não definem se a entrada é uma string ou um objeto de URL.
fonte
Atualização 2020. Para expandir as excelentes respostas de @iamnewton e @Fernando Chavez Herrera, comecei a
@
ser usado no caminho dos URLs.Portanto, o regex atualizado é:
Se você deseja permitir isso na string de consulta e no hash, use:
Dito isto, não tenho certeza se há uma regra de white paper não permitida
@
na string ou no hash da consulta.fonte
Já existem muitas respostas, mas aqui está outra contribuição: Extraído diretamente da
URL
verificação de validade do polyfill, use uminput
elemento comtype="url"
para aproveitar a verificação de validade interna do navegador:Fonte
fonte