Regex di PHP per la validation di un URL

Sto cercando una regex decente per abbinare un URL (un URL completo con schema, dominio, path ecc.) Normalmente utilizzerei filter_var ma non posso in questo caso perché devo supportre PHP <5.2!

Ho cercato nel web ma non riesco a trovare nulla di cui sono fiducioso, a prova di infallibilità, e tutto quello che posso trovare su SO è la gente che dice di usare filter_var.

Qualcuno ha una regex che usano per questo?

Il mio codice (solo così puoi vedere cosa sto cercando di get):

function validate_url($url){ if (function_exists('filter_var')){ return filter_var($url, FILTER_VALIDATE_URL); } return preg_match(REGEX_HERE, $url); } 

Potresti provare questo . Non l'ho provato da solo, ma è sicuramente la più grande espressione regolare che abbia mai visto, ahah.

 ^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\[email protected])?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[az]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[af\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[af\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[af\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[af\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[af\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[af\d]{2})*)?$ 

Ho creato una soluzione per la validation del dominio. Sebbene non copra specificamente l'integer URL, è molto dettagliato e specifico. La domanda che devi porre è: "Perché convalido un dominio?" Se è per vedere se il dominio potrebbe effettivamente esistere, allora è necessario confermare il dominio (compresi i TLD validi). Il problema è che troppi sviluppatori prendono il collegamento di [[az] {2,4}) e lo chiamano buono. Se pensi in questo modo, allora perché chiamarlo validazione URL? Non è. Sta solo passando l'URL attraverso un'espressione regolare.

Ho una class open source che ti permetterà di validationre il dominio non solo usando la singola fonte per la gestione di TLD (iana.org), ma convaliderà anche il dominio tramite i record DNS per assicurarti che esista effettivamente. La validation DNS è facoltativa, ma il dominio sarà specificamente valido in base a TLD.

Ad esempio: example.ay NON è un dominio valido poiché TLD .ay non è valido. Ma usando la regex pubblicata qui ([az] {2,4}), sarebbe passata. Ho un'affinità per la qualità. Provo ad esprimerlo nel codice che scrivo. Altri potrebbero non interessarsene. Quindi, se vuoi semplicemente "controllare" l'URL, puoi utilizzare gli esempi elencati in queste risposte. Se in realtà vuoi validationre il dominio nell'URL, puoi averlo nella class che ho creato per fare proprio questo. Può essere scaricato all'indirizzo: http://code.google.com/p/blogchuck/source/browse/trunk/domains.php

Si validation in base alle RFC che "governano" (usando il termine liberamente) ciò che determina un dominio valido. In poche parole, ecco cosa farà la class dei domini: regole di base della validation del dominio

  • deve essere lungo alless un carattere
  • deve iniziare con una lettera o un numero
  • contiene lettere, numbers e trattini
  • deve terminare con una lettera o un numero
  • può contenere più nodes (ad esempio node1.node2.node3)
  • each nodo può contenere solo 63 caratteri max
  • il nome di dominio totale può essere lungo solo 255 caratteri max
  • deve terminare con un TLD valido
  • può essere un indirizzo IP4

Inoltre, scaricherà una copia del file TLD principale iana.org solo dopo aver controllato la copia locale. Se la tua copia locale non è aggiornata entro 30 giorni, scaricherà una nuova copia. I TLD nel file verranno utilizzati in REGEX per validationre il TLD nel dominio che si sta validationndo. Questo impedisce a .ay (e ad altri TLD non validi) di superare la validation.

Questo è un lungo pezzetto di codice, ma molto compatto considerando quello che fa. Ed è il più preciso. Ecco perché ho fatto la domanda prima. Vuoi fare "validazione" o semplice "verifica"?

Ho visto una regex che potrebbe effettivamente validare qualsiasi tipo di URL valido ma era lungo due pagine …

Probabilmente stai meglio parsing parse_url con parse_url e poi controlla se tutti i bit richiesti sono in ordine.

Aggiunta: questo è uno snip della mia class URL:

 public static function IsUrl($test) { if (strpos($test, ' ') > -1) { return false; } if (strpos($test, '.') > 1) { $check = @parse_url($test); return is_arrays($check) && isset($check['scheme']) && isset($check['host']) && count(explode('.', $check['host'])) > 1 } return false; } 

Verifica la string data e richiede alcune nozioni di base nell'URL, vale a dire che lo schema è impostato e il nome host ha un punto in esso.

 !(https?://)?([-_a-z0-9]+\.)*([-_a-z0-9]+)\.([az]{2,4})(/?)(.*)!i 

Io uso questa espressione regolare per validationre gli URL. Finora non mi ha deluso neanche una volta 🙂