2011-01-11 10 views
1

Ich versuche form_validation zu verwenden, um einen Domain-Namen mit einem benutzerdefinierten Lauf zu überprüfen:Validieren, wenn der String ist ein FQDN (Codeigniter)

function fqdn($str) 
    { 

     $CI =& get_instance(); 
     $CI->form_validation->set_message('fqdn','The %s is not a valid domain name.'); 

     $re1='((?:[a-z][a-z\\.\\d\\-]+)\\.(?:[a-z][a-z\\-]+))(?![\\w\\.])'; 
     if ($c=preg_match_all ("/".$re1."/is", $str, $matches)){ 

      return TRUE; 
     } 
     else{ 
      return FALSE; 
     } 
    } 

Das funktioniert relativ gut außer ich es nicht wollen, wahr zurück, wenn Es gibt @ irgendwo in der Adresse und auch dort, wo es führende oder schleppende - Wie würde ich gehen über die Änderung des Codes zu entsprechen.

Auch ich gehe das alles falsch sollte es etwas anderes sollte ich tun, damit ich sicherstellen kann, dass die ext korrekt sind und nicht einige erfunden Müll.

Danke für Ihre Zeit.

Antwort

0
function fqdn($str) { 

     $CI =& get_instance(); 
     $CI->form_validation->set_message('fqdn','The %s is not a valid domain name.'); 

     $tld_list = array(
      'arp', 'com', 'edu', 'gov', 'int', 'mil', 'net', 'org', 
      'aero', 'biz', 'coop', 'info', 'museum', 'name', 'pro', 'ws', 
      'ac', 'ad', 'ae', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'as', 
      'at', 'au', 'aw', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'bj', 
      'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 
      'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'cr', 'cu', 'cv', 'cx', 
      'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'ee', 'eg', 'eh', 'er', 
      'es', 'et', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gd', 'ge', 'gf', 'gg', 
      'gh', 'gi', 'gl', 'gm', 'gn', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 
      'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'io', 'iq', 
      'ir', 'is', 'it', 'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 
      'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 
      'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk', 'ml', 'mm', 'mn', 'mo', 
      'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nc', 
      'ne', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'pa', 'pe', 
      'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'ps', 'pt', 'pw', 'py', 'qa', 
      're', 'ro', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj', 
      'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'sv', 'sy', 'sz', 'tc', 'td', 'tf', 
      'tg', 'th', 'tj', 'tk', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw', 'tz', 
      'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 
      'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', 'zw'); 

     $label = '[\\w][\\w\\.\\-]{0,61}[\\w]'; 
     $tld = '[\\w]+'; 

     if($c=preg_match("/^($label)\\.($tld)$/", $str, $match) && in_array($match[2], $tld_list)) { 

      return TRUE; 
     } 
     else{ 
      return FALSE; 
     } 
    } 

Falls jemand was zu wissen :)

+0

das ist definitiv nicht der richtige Weg, wie zu validieren ... weil Sie tld nicht hartcodieren können, könnten sie ändern und neue werden gemacht ... – davispuh

+1

@davispuh Dies ist eine Frage über ein Jahr alt, hat niemand sagte irgendetwas oder korrigierte es seitdem. Wenn Sie denken, dass Sie eine bessere Antwort haben, werde ich meine Antwort glücklicherweise * entziffern * und Ihre Antwort ankreuzen, so dass Leute, die kommen, um nach einer solchen Antwort zu suchen, eine korrekte Antwort erhalten, von der sie lernen können. :) – Elgoog

+0

Laut [dieser Liste] (http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains) vermissen Sie bei einem flüchtigen Blick mehrere neue. – Shadur

2

gut, habe ich dieses

function IsValidFQDN($FQDN) { 
    return (!empty($FQDN) && preg_match('/(?=^.{1,254}$)(^(?:(?!\d|-)[a-z0-9\-]{1,63}(?<!-)\.)+(?:[a-z]{2,})$)/i', $FQDN) > 0); 
} 

ich das selbst nicht gemacht hatte, nahm aber von FQDN Regular Expression und ein bisschen so bearbeitet wurde stimmt nicht nur mit dem Hostnamen überein z. myhost auch zur Kenntnis nehmen, dass es nicht umgekehrt Domains wie überein 123.213.in-addr.arpa

es wird jede TLD entsprechen, auch solche, die jetzt nicht existiert, sondern könnten in Zukunft;) wie yoyo.mama

EDIT:

ACHTUNG! Diese Regexp wird Domains ablehnen, die mit einer Ziffer oder internationalen Domains beginnen, daher ist es strenger als erforderlich.

$tld_list = file('http://data.iana.org/TLD/tlds-alpha-by-domain.txt'); 
$tld_list = array_values(array_diff($tld_list, preg_grep('/^(#|XN--)/', $tld_list))); 

Es wird nur die Textdatei aus IANA.org als Array

:

+0

Das war der Hauptgrund, warum ich nicht mit einem solchen Ansatz gegangen bin, da ich kontrollieren musste, welche Domainerweiterungen hinzugefügt wurden. Aber ja, mit der nahen Zukunft des Domain-Namens tld/cctld changing (Möglichkeit von 1000 neuen pro Jahr) würde das gut funktionieren, wenn Sie mit der ungeraden Domäne leben könnten, die nicht gültig ist. :) – Elgoog

+0

gibt es einen Unterschied, Sie müssen entweder gültig oder vorhanden sein. Wenn Sie eine existierende benötigen, müssen Sie den nächsten Schritt tun. Überprüfen Sie, ob eine solche Domain existiert und Sie können es mit [checkdnsrr] (http://php.net/manual/en/function.checkdnsrr.php) – davispuh

+0

Es akzeptiert weder '123.com' noch' 123abc.com'. –

0

Sie können eine schnelle Array von TLD von IANA Textdatei erhalten, indem so etwas wie dies zu tun. Entfernt dann die Kommentare und internationalen Einträge, die nicht in englische Zeichen-TLDs geparst sind. Ich glaube, dass diese Datei regelmäßig auf dem neuesten Stand gehalten wird - das Datum steht an der Spitze der Datei. Ich würde es jedoch nicht spammen.

Verwandte Themen