webForumDet fria alternativet

Formvalidering med RegExp

JavaScript

5 svar · 597 visningar · startad av Nate.A

Medlem sedan mars 2006296 inlägg
Frågan#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 .

Medlem sedan aug. 20039 340 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])/
Medlem sedan mars 2006296 inlägg
#3

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

Medlem sedan aug. 20039 340 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]$/;
Medlem sedan juni 20014 421 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!

Medlem sedan mars 2006296 inlägg
#6

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

Tack till er båda!

257 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)