Eu queria saber como validar melhor os URLs no Rails. Eu estava pensando em usar uma expressão regular, mas não tenho certeza se essa é a melhor prática.
E, se eu usasse uma regex, alguém poderia me sugerir uma? Eu ainda sou novo no Regex.
Eu queria saber como validar melhor os URLs no Rails. Eu estava pensando em usar uma expressão regular, mas não tenho certeza se essa é a melhor prática.
E, se eu usasse uma regex, alguém poderia me sugerir uma? Eu ainda sou novo no Regex.
Respostas:
Validar um URL é um trabalho complicado. Também é uma solicitação muito ampla.
O que você quer fazer exatamente? Deseja validar o formato da URL, a existência ou o quê? Existem várias possibilidades, dependendo do que você deseja fazer.
Uma expressão regular pode validar o formato do URL. Mas mesmo uma expressão regular complexa não pode garantir que você esteja lidando com um URL válido.
Por exemplo, se você usar uma expressão regular simples, ela provavelmente rejeitará o seguinte host
mas permitirá
esse é um host válido, mas não um domínio válido se você considerar os TLDs existentes. De fato, a solução funcionaria se você deseja validar o nome do host, não o domínio, porque o seguinte é um nome de host válido
bem o seguinte
Agora, deixe-me dar algumas soluções.
Se você deseja validar um domínio, precisa esquecer as expressões regulares. A melhor solução disponível no momento é a Public Suffix List, uma lista mantida pela Mozilla. Criei uma biblioteca Ruby para analisar e validar domínios com relação à lista pública de sufixos, chamada PublicSuffix .
Se você deseja validar o formato de um URI / URL, convém usar expressões regulares. Em vez de procurar um, use o
URI.parse
método Ruby interno.Você pode até decidir torná-lo mais restritivo. Por exemplo, se você quiser que o URL seja um URL HTTP / HTTPS, poderá tornar a validação mais precisa.
Obviamente, existem inúmeras melhorias que você pode aplicar a esse método, incluindo a verificação de um caminho ou esquema.
Por último, mas não menos importante, você também pode empacotar esse código em um validador:
fonte
URI::HTTPS
para https uris (ex:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
herdaURI:HTTP
, é por isso que eu usokind_of?
.URI.parse('http://invalid-host.foo')
retorna true porque esse URI é um URL válido. Observe também que.foo
agora é um TLD válido. iana.org/domains/root/db/foo.htmlEu uso um liner dentro dos meus modelos:
validates :url, format: URI::regexp(%w[http https])
Eu acho que é bom o suficiente e simples de usar. Além disso, deveria ser teoricamente equivalente ao método de Simone, pois usa o mesmo regexp internamente.
fonte
'http://'
corresponde ao padrão acima. Veja:URI::regexp(%w(http https)) =~ 'http://'
http:fake
será válido.Seguindo a ideia de Simone, você pode criar facilmente seu próprio validador.
e depois use
no seu modelo.
fonte
URI("http:").kind_of?(URI::HTTP) #=> true
Também há uma validate_url gem (que é apenas um bom invólucro para a
Addressable::URI.parse
solução).Basta adicionar
ao seu
Gemfile
e, em modelos, você podefonte
Esta pergunta já está respondida, mas que diabos, proponho a solução que estou usando.
O regexp funciona bem com todos os URLs que conheci. O método setter é tomar cuidado se nenhum protocolo for mencionado (vamos assumir http: //).
E, finalmente, tentamos buscar a página. Talvez eu deva aceitar redirecionamentos e não apenas HTTP 200 OK.
e...
fonte
Você também pode tentar a gem valid_url, que permite URLs sem o esquema, verifica a zona do domínio e os nomes de host IP.
Adicione-o ao seu Gemfile:
gem 'valid_url'
E então no modelo:
fonte
Apenas meus 2 centavos:
EDIT: mudou a regex para corresponder aos URLs dos parâmetros.
fonte
http://test.com/fdsfsdf?a=b
A solução que funcionou para mim foi:
Eu tentei usar alguns dos exemplos anexados, mas estou suportando o URL da seguinte forma:
Observe o uso de A e Z porque se você usar ^ e $, verá este aviso de segurança dos validadores do Rails.
fonte
"https://portal.example.com/portal/#"
. No Ruby 2.1.6, a avaliação trava.Ultimamente, encontrei o mesmo problema (eu precisava validar URLs em um aplicativo Rails), mas precisava atender aos requisitos adicionais de URLs unicode (por exemplo
http://кц.рф
) ...Eu pesquisei algumas soluções e me deparei com o seguinte:
URI.parse
. Verifique a resposta de Simone Carletti para obter detalhes. Isso funciona bem, mas não para URLs unicode.URI.parse
mas usando aaddressable
gem em vez doURI
stdlib. Essa abordagem é detalhada aqui: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/fonte
Addressable::URI.parse('http:///').scheme # => "http"
ouAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
são perfeitamente ok do ponto de vista :( do endereçávelAqui está uma versão atualizada do validador postada por David James . Foi publicado por Benjamin Fleischer . Enquanto isso, empurrei um fork atualizado, que pode ser encontrado aqui .
...
Observe que ainda existem URIs HTTP estranhos que são analisados como endereços válidos.
Aqui está um problema para a
addressable
gema que cobre os exemplos.fonte
Eu uso uma ligeira variação na solução Lafeber acima . Não permite pontos consecutivos no nome do host (como por exemplo em
www.many...dots.com
):URI.parse
parece exigir a prefixação do esquema, que em alguns casos não é o que você deseja (por exemplo, se você deseja permitir que seus usuários escrevam rapidamente URLs em formas comotwitter.com/username
)fonte
Eu tenho usado a gema 'activevalidators' e funciona muito bem (não apenas para validação de URLs)
você pode encontrá-lo aqui
Está tudo documentado, mas basicamente, uma vez adicionada a gema, você adicionará as seguintes linhas em um inicializador: /config/environments/initializers/active_validators_activation.rb
(Nota: você pode substituir: all por: url ou: what, se você quiser apenas validar tipos específicos de valores)
E então, de volta ao seu modelo, algo como isto
Agora reinicie o servidor e deve ser
fonte
Se você deseja uma validação simples e uma mensagem de erro personalizada:
fonte
Você pode validar vários URLs usando algo como:
fonte
https://github.com/perfectline/validates_url é uma jóia agradável e simples que fará praticamente tudo por você
fonte
Recentemente, tive esse mesmo problema e encontrei uma solução alternativa para URLs válidos.
A primeira parte do método validate_url é suficiente para validar o formato da URL. A segunda parte garantirá que o URL exista enviando uma solicitação.
fonte
Eu gostava de monkeypatch o módulo URI para adicionar o válido? método
dentro
config/initializers/uri.rb
fonte
E como um módulo
E, em seguida, apenas
include UrlValidator
em qualquer modelo para o qual você deseja validar os URLs. Apenas incluindo opções.fonte
A validação de URL não pode ser gerenciada simplesmente usando uma Expressão regular, pois o número de sites continua crescendo e novos esquemas de nomeação de domínio continuam aparecendo.
No meu caso, simplesmente escrevo um validador personalizado que verifica se há uma resposta bem-sucedida.
Estou validando o
path
atributo do meu modelo usandorecord.path
. Também estou enviando o erro para o respectivo nome de atributo usandorecord.errors[:path]
.Você pode simplesmente substituir isso por qualquer nome de atributo.
Depois, simplesmente chamo o validador personalizado no meu modelo.
fonte
Você pode usar regex para isso, para mim funciona bem este:
fonte