06. maj 2004 - 15:09Der er
18 kommentarer og 1 løsning
Validering af form felter
Jeg har dette script som tjekker form felter for ugyldige tegn.... Hvordan får jeg det til at virke med linjeskift? har prøvet at lægge " & vbCrlf til, til sidst, men det virker nada... :) <SCRIPT LANGUAGE="JavaScript"> <!-- Begin function validate(field) { var valid = "äöÅÄÖ_-æøÅÆØ.,QWERTYUIOPÅØÆLKJHGFDSAZXCVBNMmnbvcxzøælkjhgfdsaåpoiuytrewq1234567890?!():; " & vbCrlf var ok = "yes"; var temp; for (var i=0; i<field.value.length; i++) { temp = "" + field.value.substring(i, i+1); if (valid.indexOf(temp) == "-1") ok = "no"; } if (ok == "no") { alert("You are using invalid characters!"); field.focus(); field.select(); } } // End --> </script>
ville det ikke være lettere at bruge en regular expression: <script language="javascript" type="text/javascript"> function validate(field) { var ok = true; if (field.value.match(/[^\w\?\!\(\)\:\;\n ]/ig)) ok = false; if (!ok) { alert("You are using invalid characters!"); field.focus(); field.select(); } } </script>
Kan være jeg har glemt nogle characters - men pointen her er at bruge \n som tegn på en ny linie.
der skulle også stå \r - som matcher en "tryk på retur-tasten", altså: if (field.value.match(/[^\w\?\!\(\)\:\;\n\r ]/ig)) ok = false;
Du kan relativt let tilføje ekstra tegn: Bare skriv tegnet og (for en sikkerheds skyld) skrive \ foran (også hvis du vil tillade \-tegnet). Grunden til at man sætter \ foran er hvis javascript tolker tegnet som et specielt tegn i en regular expression. Det er ikke alle du skal gøre det ved, men hvis du i forvejen ikke kender til regular expressions så vil jeg anbefale dig i starten bare at gøre det foran alle de specielle tegn du bruger.
Det er temmelig svært at lære regular expressions, så her er hvordan jeg vil skrive det samlede resultat med de ekstra tegn: if (field.value.match(/[^\w\?!\(\):\;\n\r%\,\.\'\" ]/ig)) ok = false;
Jeg kender ikke umiddelbart en god tutorial, men prøv at søge lidt rundt på nettet - der finder du sikkert noget godt om emnet. Jeg vil i hvert fald anbefale dig at forsøge på at lære regexp's, da de kan være meget nyttefulde specielt når man skal validere brugerens input.
' og " så kan folk jo lave det der snedige trick... ' OR 1=1 '
Jeg har redigeret den lidt... if (field.value.match(/[^\w\?!\(\):\;\n\r%\,\.\ ]/ig)) ok = false; Hvilke tegn blocker den helt præcist nu? Og hvordan får jeg den til at blocke < > og %?
scriptet er lavet så den blocker alt hvad der ikke passer ind i de tegn du har skrevet i din regular expression - det er derfor der står ^ i starten. Hvis du vil blocke % skal du bare fjerne det fra field.value.match(....)
Læg mærke til at jeg bruger \w - den tillader her alle bogstaver (a-z), alle tal samt underscore (_).
prøver lige at finde ud af noget - men har kun fundet indtil videre en metode i mozilla. Så hvis du kan vente lidt skal jeg se hvad jeg kan finde ud af :-)
sådan - det skulle gerne virke i både IE og Mozilla - i Opera er der ikke så vidt jeg kender en mulighed for at lave en lignende trick: <script language="javascript" type="text/javascript"> function validate(field) { var ok = true; var pos = field.value.search(/[^\w\?!\(\):\;\n\r%\,\.\ ]/ig); if (pos != -1) ok = false; if (!ok) { alert("You are using invalid characters!"); field.focus(); placeCursor(field,pos); } } function placeCursor(frmElm,pos) { if (document.selection) { r = frmElm.createTextRange(); var endp = -(frmElm.value.length-(pos+1)); r.moveEnd("character",endp); r.moveStart("character",pos); r.select(); } if (frmElm.selectionEnd != undefined && pos != undefined) { frmElm.setSelectionRange(pos,pos+1); } } </script>
Læg mærke til at den kun markerer det første bogstav, der er forkert. Det er nemlig ikke muligt at markere forskellige dele af teksten samtidig, derfor måtte jeg vælge at holde mig til det enkelte bogstav.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.