Estou procurando um regex simples para URLs, alguém tem um útil que funcione bem? Eu não encontrei um com as classes de validação de estrutura zend e vi várias implementações.
php
regex
url
validation
AndreLiem
fonte
fonte
Respostas:
Usei isso em alguns projetos, não acredito que tenha tido problemas, mas tenho certeza de que não é exaustivo:
A maior parte do lixo aleatório no final é para lidar com situações como
http://domain.com.
em uma frase (para evitar coincidir com o período à direita). Tenho certeza de que poderia ser limpo, mas desde que funcionou. Copiei mais ou menos de um projeto para outro.fonte
google.com
é apenas um caminho de URL relativo válido, mas não um URL absoluto válido. E acho que é isso que ele está procurando.http://example.com/somedir/...
é uma URL perfeitamente legítima, solicitando o arquivo nomeado...
- que é um nome legítimo.http://www.example
seja válidoUse a
filter_var()
função para validar se uma sequência é URL ou não:É uma prática ruim usar expressões regulares quando não for necessário.
EDIT : Tenha cuidado, esta solução não é segura para unicode e XSS. Se você precisar de uma validação complexa, talvez seja melhor procurar outro lugar.
fonte
http://www
De acordo com o manual do PHP - parse_url não deve ser usado para validar uma URL.
Infelizmente, parece que
filter_var('example.com', FILTER_VALIDATE_URL)
não tem um desempenho melhor.Ambos
parse_url()
efilter_var()
transmitirão URLs malformados, comohttp://...
Portanto, neste caso - regex é o melhor método.
fonte
Apenas no caso de você querer saber se o URL realmente existe:
fonte
$url
antes de realmente verificar se o URL é real porque a operação acima é cara - talvez até 200 milissegundos, dependendo do tamanho do arquivo. Em alguns casos, o URL pode ainda não ter um recurso disponível no local (por exemplo, criar um URL para uma imagem que ainda não foi carregada). Além disso, você não está usando uma versão em cache, portanto, não é assimfile_exists()
que irá armazenar em cache uma estatística em um arquivo e retornar quase instantaneamente. A solução que você forneceu ainda é útil. Por que não usar apenasfopen($url, 'r')
?Conforme John Gruber (Daring Fireball):
Regex:
usando em preg_match ():
Aqui está o padrão regex estendido (com comentários):
Para mais detalhes, consulte: http://daringfireball.net/2010/07/improved_regex_for_matching_urls
fonte
Eu não acho que usar expressões regulares seja uma coisa inteligente a se fazer neste caso. É impossível corresponder a todas as possibilidades e, mesmo que você tenha, ainda há uma chance de que o URL simplesmente não exista.
Aqui está uma maneira muito simples de testar se o URL realmente existe e é legível:
(se não houver
preg_match
, isso também validaria todos os nomes de arquivos no seu servidor)fonte
Eu usei este com bom sucesso - não me lembro de onde consegui
fonte
fonte
E aí está a sua resposta =) Tente quebrar, você não pode !!!
fonte
Edit:
Como a incidência apontou, este código foi DEPRECADO com o lançamento do PHP 5.3.0 (30-06-2009) e deve ser usado de acordo.
Apenas meus dois centavos, mas desenvolvi essa função e a uso há algum tempo com sucesso. Está bem documentado e separado para que você possa alterá-lo facilmente.
fonte
fonte
Inspirado nesta questão do .NET StackOverflow e neste artigo referenciado dessa pergunta, existe este validador de URI (URI significa que valida a URL e a URN).
Testei com êxito esta função dentro de um ValueObject que criei nomeado
Uri
e testado porUriTest
.UriTest.php (contém casos válidos e inválidos para URLs e URNs)
Uri.php (objeto de valor)
Running UnitTests
Existem 65 afirmações em 46 testes. Cuidado: existem 2 provedores de dados para expressões válidas e mais 2 para expressões inválidas. Um é para URLs e o outro para URNs. Se você estiver usando uma versão do PhpUnit da v5.6 * ou anterior, será necessário unir os dois provedores de dados em um único.
Cobertura de código
Há 100% de cobertura de código neste verificador de URI de amostra.
fonte
(http (s?): //) significa http: // ou https: //
([a-z0-9 -] +.) + => 2.0 [a-z0-9-] significa qualquer caractere az ou qualquer sinal 0-9 ou (-))
"/(http(s?)://)([a-z0-9-)+.)+[azorgeous{2,4}(.[azorgeous{2,4}) (/ [^] + ) / i "
Nota: Desculpe pelo mau inglês. Meu país não usa bem.
fonte
OK, então isso é um pouco mais complexo que um simples regex, mas permite diferentes tipos de URLs.
Exemplos:
Tudo o que deve ser marcado como válido.
Observe que há uma verificação in_array para os protocolos que você deseja permitir (atualmente apenas http e https estão nessa lista).
fonte
O melhor URL Regex que funcionou para mim:
Exemplos:
Fonte: http://urlregex.com/
fonte
O Regex de Peter não parece correto para mim por muitas razões. Ele permite todos os tipos de caracteres especiais no nome do domínio e não faz muitos testes.
A função de Frankie parece boa para mim e você pode criar uma boa regex a partir dos componentes, se não quiser uma função, da seguinte forma:
Não testado, mas acho que deve funcionar.
Além disso, a resposta de Owen também não parece 100%. Peguei a parte do domínio do regex e testei-o em uma ferramenta de teste do Regex http://erik.eae.net/playground/regexp/regexp.html
Eu coloquei a seguinte linha:
na seção "regexp" e na seguinte linha:
na seção "texto de amostra".
O resultado permitiu o caractere de menos. Porque \ S significa qualquer caractere não espacial.
Observe que o regex de Frankie lida com o sinal de menos porque tem essa parte para o primeiro caractere:
O que não permitirá o menos ou qualquer outro caractere especial.
fonte
Aqui está o jeito que eu fiz. Mas quero dizer que não sou tão tímido quanto ao regex. Mas deve funcionar tu :)
Dessa forma, você não precisará do marcador de avaliação em seu padrão.
Espero que ajude :)
fonte
Aqui está uma classe simples para validação de URL usando RegEx e, em seguida, faça referência cruzada do domínio com os populares servidores RBL (Realtime Blackhole Lists):
Instalar:
Uso:
Adicione uma URL como parâmetro do
domain()
método e verifique o retorno.Resultado:
Como você pode ver acima, www.bokranzr.com é listado como site malicioso por meio de uma RBL, de modo que o domínio foi retornado como falso.
fonte
Para quem estiver desenvolvendo com WordPress, basta usar
para validar uma URL ( aqui está a documentação do WordPress
esc_url_raw
). Ele lida com URLs muito melhor do quefilter_var($url, FILTER_VALIDATE_URL)
porque é seguro para Unicode e XSS. ( Aqui está um bom artigo mencionando todos os problemas comfilter_var
).fonte
Eu achei que isso era o mais útil para combinar um URL.
fonte
ftp:
?Existe uma função nativa do PHP para isso:
Retorna os dados filtrados, ou FALSE se o filtro falhar.
Confira aqui
fonte