webForumDet fria alternativet

Formvalidering med RegExp

5 svar · 595 visningar · startad av Nate.A

Nate.AMedlem sedan mars 2006280 inlägg
#1

Hej

Jag får inte ordning på min formulär validering. Jag har testat min Regexp i ett testscript, så det ska fungera, men av någon anledning så vägrar scriptet godkänna datumet fast det ska matcha regexp. Jag har stirrat mig blind på det här i flera timmar nu.... :(

js:

<script language="javascript">
function validera()
{
	var form_hemmalag  = document.getElementById('hemmalag');
	var form_bortalag  = document.getElementById('bortalag');
	var form_datum	   = document.getElementById('datum');
	var form_tid	   = document.getElementById('tid');
	var datum_ptn 	   = new RegExp("\d\d\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])"); 
	var tid_ptn		   = new RegExp("(0[0-9]|1[0-9]|2[01234])[:][0-5][0-9]");
	var felmeddelanden = '';
	
	if (form_hemmalag.value == form_bortalag.value) 
	{
		form_hemmalag.style.backgroundColor='#fdd';
		form_bortalag.style.backgroundColor='#fdd';
		felmeddelanden += '- Laget kan inte spela mot sig själva! \n';
	}

	if (form_datum.value =='' || form_datum.value==null)
	{
		form_datum.style.backgroundColor = '#fdd';
		felmeddelanden += '- Du måste ange datum. \n';
	}
	else if (datum_ptn.test(form_datum.value) == false)
	{
		form_datum.style.backgroundColor = '#fdd';
		felmeddelanden += '- Felaktigt datum, formatet ska vara åååå-mm-dd \n';
	}
	
	if (tid_ptn.test(form_tid.value) == false)
	{
		form_tid.style.backgroundColor ='#fdd';
		felmeddelanden += '- Du måste ange tid i korrekt format. (hh:mm) \n';
	}
	
	if (felmeddelanden.length >1)
	{
		alert('Följande fel hittades:\n' + felmeddelanden);
		return false
	}
	else {return true}

}
</script>

alt. testa här .

nitro2k01Medlem sedan aug. 20037 630 inlägg
#2

Felet beror på att \d tolkas om när det ligger i en sträng. \d tolkas i själva verket bara som d. Du kan lösa det på två sätt.

  1. Du kan escapa \. Alltså:
    var datum_ptn = new RegExp("\\d\\d\\d\\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])");
  2. Eller så kan du skriva regexpen med slash-notation
    var datum_ptn = /\d\d\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])/
Nate.AMedlem sedan mars 2006280 inlägg
#3

Tackar! Du e en klippa nitro2k01!
Nu räddade du min nattsömn :)

nitro2k01Medlem sedan aug. 20037 630 inlägg
#4

Just ja, en sak till. De regexparna matchar bara datumsträngen, men kräver inte att strängen bara består av datumsträngen. Alltså, alla strängar passerar valideringen så länge de innehåller något som validerar mot datum-regexpen, oavsett om användaren har skrivit något mer innan eller efter. xxx2007-03-18yyy skulle alltså validera med din regexp.
Mitt förslag: Använd ^ och $ som matchar mot början resp. slutet av en sträng.
Alltså:

	var datum_ptn 	   = /^\d\d\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/; 
	var tid_ptn		   = /^(0[0-9]|1[0-9]|2[01234])[:][0-5][0-9]$/;
colioneMedlem sedan juni 20013 386 inlägg
#5

Gah, jag får ocd när jag ser fyra st \d i rad. Det är inget fel, men det ser så fult ut :D

var datum_ptn 	   = /^\d{4}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/;

Ahh, sådär...nu är min värld i ordning igen!

Nate.AMedlem sedan mars 2006280 inlägg
#6

aha.. då har jag lärt mig något nytt idag med :)

Tack till er båda!

128 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
125 ms — hämta tråd, inlägg och bilagor (db)