2012-04-01 13 views
0

Ich habe ein Feld, wo Menschen ihre IP eingeben. Also versuche ich das Feld mit Jquery zu überprüfen:jquery Validierung mit IP und http

$.validator.addMethod("http-ipvalidation", 
    function(value, element) { 
     return /^[\d.]+$/.test(value); 
    }, 
    "Sorry, only numbers and dots allowed here" 
); 

Aber einige Leute sind mit DynDNS, die dann eine URL verwenden können. Jetzt muss ich beides zulassen. Gibt es eine Möglichkeit, die Standard-Jquery-URL-Validierung mit meiner benutzerdefinierten IP-Validierung zu kombinieren?

Ich kann den jquery url Scheck ändern, aber diese regex ist verrückt, so würde ich nicht weiß, wo man anfangen soll:

return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(val); 

plus Ich denke, es wäre schön, Menschen ohne die http(s):// eingeben zu ermöglichen, wie ein Teil davon. Um es zusammenzufassen ich Validierung erstellen möchten, wo Benutzer eingeben:

12.34.56.78 oder my.domain.com oder http://my.domain.com

Vielleicht sollte ich nur eine einfache Validierung nehmen einige Sonderzeichen zu nehmen und es dabei zu belassen? Danke im Voraus.

Antwort

1

Ich empfehle fast nichts, um dieses Feld zu validieren; IDN bedeutet, dass Benutzer legal fast alles in das Feld eingeben können: t. Tk (derzeit ein Domain-Squatter) oder (b ִ̅̅ o ִ̅̅ x ִ̅̅ e ִ̅̅ d ִ̅̅̅█. Tk (eine Website katalogisiert einige IDN-Domainnamen) oder andere schreckliche -suchende, aber dennoch rechtmäßige Adressen, die die meisten Browser in ihre ASCII-Gegenstücke hinter den Kulissen verwandeln können.

0

Dies ist, wo UI-Entwickler mich (und Sie, es klingt wie) tatsächlich in Spaß Informatik Sachen stopfen. Sie sehen sich wahrscheinlich nur ein paar Stunden Regex-Lernen an, und Sie werden Regex für den Rest Ihrer Karriere verwenden.

Ich denke, die einfachste Art und Weise, dies zu tun in zwei Durchgängen sein würde:

  1. bestimmen, ob sie eine URL oder eine IP-Adresse eingegeben haben. Es sollte ziemlich einfach sein zu bestimmen, dass es eine IP ist. Vielleicht strippen Sie alle "." S aus und überprüfen Sie dann, ob es nur Zahlen gibt.
  2. Führen Sie die Validierung für IP-Adresse oder URL basierend auf dem Ergebnis von Schritt 1 aus. Wie SArnold sagt, gibt es wahrscheinlich nicht viel, was Sie für URLs validieren können, aber Sie können das http: // für sie auf diese Weise optional machen.

Ressourcen: http://www.regular-expressions.info/javascript.html http://txt2re.com/

0

Dies könnte das Problem ein wenig sein ausweicht, aber ich würde es wahrscheinlich zu einem Programm wie Ping, Locke oder nslookup Unix verschieben. Ich weiß nicht, ob du das aus einem anderen Grund tun willst, aber ich denke, es würde funktionieren.

$.validator.addMethod("http-ipvalidation", 
    function(value, element) { 
     result = false 
     $.getJSON({async:false,url:verify.php,success:function(resp){result=resp.result}}) 
     return result; 
    }, 
    "Sorry, ip address invalid" 
); 

Und in verify.php Sie so etwas wie haben würde: Ping site and return result in PHP

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$data = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
if($httpcode>=200 && $httpcode<300) { 
    return true; 
} else { 
    return false; 
} 

Also diese Weise ein Fehler wirft, ob die IP-Adresse sie ist ungültig Eingabe sind, oder wenn es keine echte IP-Adresse. Ich weiß nicht, ob dies das gewünschte Verhalten ist.

Verwandte Themen