reguliere expressies
vraagje ter verduidelijking:
mijn boek controleert op deze wijze de invoer, snap de werking wel vind het alleen erg moeilijk om het te ontleden
Code (php)
1
2
3
4
2
3
4
function valid_mail($str)
{
return (preg_match('/(^[0-9a-zA-Z_\.-]{1,}@([0-9a-zA-Z_\-]{1,}\.)+[0-9a-zA-Z_\-]{2,}$/'));
}
{
return (preg_match('/(^[0-9a-zA-Z_\.-]{1,}@([0-9a-zA-Z_\-]{1,}\.)+[0-9a-zA-Z_\-]{2,}$/'));
}
dit deel
ik snap dat hij het zo opbouwt:
[email protected]
maar wel gedeelte kijkt nou naar welk stuk..
zo?
ray.degraaf => [0-9a-zA-Z_\.-] {1,} // 1 of meer keren 1 van deze tekens
@ => staat tussen [string]@[string] dus dat moet ook bij invoer?
live => [0-9a-zA-Z_\-] {1,} // 1 of meer keren 1 van deze tekens
. => \.)+[ // lijkt me te zeggen een . gevolgt door 1 of meer .?? STORING!
nl => [0-9a-zA-Z_\-] {2,} $ // minimaal 2 van deze tekens en kijk van achter
er is dus een stukje die met STORING geeft
met voorbaat dank
. is een meta character en moet je dus escapen: \. Vervolgens is de ) een sluiting van een haakje dat nog niet gesloten is.
Het zegt dus eigenlijk:
([0-9a-zA-Z_\-]{1,}\.)+
Een reeks letters, cijfers, _ en - die min. 1 keer achter elkaar voorkomen (waarom ze hier niet + gebruiken vind ik vreemd), dus bijv. 'h' of 'hallo' of 'w8_' wordt allemaal goedgekeurd hierdoor. Deze worden gevolgd met een punt.
Dit hele reeksje mag 1 of meer keer voorkomen, dat is ervoor om dingen als:
@domein.co.uk
@domein.com
Goed te keuren.
dis de code zoals ie in me boek staat:
Code (php)
1
2
3
4
2
3
4
function valid_mail($str)
{
return (preg_match('/(^[0-9a-zA-Z_\.-]{1,}@([0-9a-zA-Z_\-]{1,}\.)+[0-9a-zA-Z_\-]{2,}$)/'$str));
}
{
return (preg_match('/(^[0-9a-zA-Z_\.-]{1,}@([0-9a-zA-Z_\-]{1,}\.)+[0-9a-zA-Z_\-]{2,}$)/'$str));
}
maar deze is helder, en dan deze..
lijkt wel moeilijke wiskunde
preg_match('/(^[0-9a-zA-Z. -]+$/',$str));
0-9a-zA-Z. -]+$ // is allen letters en hoofdletters en getallen een punt een spatie en koppelstreepje ||en de + = deze reeks mag vaker voorkomen en $ kijk vanaf achterin de string.
toch?
Toevoeging op 01/03/2012 20:44:28:
p.s. ben echt te veel bezig met php! droom er zelfs over en na deze expressie worden dit nachtmerries! maja niks beters te doen op de kazerne in de avond uren! zit hier tog maar gevangen :P
Quote:
0-9a-zA-Z. -]+$ // is allen letters en hoofdletters en getallen een punt een spatie en koppelstreepje ||en de + = deze reeks mag vaker voorkomen en $ kijk vanaf achterin de string.
Je moet het anders bekijken:
[] is een character class, alle characters hierin zijn toegestaan.
[0-9a-zA-Z.-] de characters 0-9, a-z, A-Z, . en - zijn toegestaan
[...]+ de + betekend 1 of meer keer, * betekend 0 of meer keer, ? betekend 1 of 2 keer, dus:
[A-Za-z0-9]* = Matches letters of cijfers 0 of meer keer achter elkaar
[A-Za-z0-9]+ = Matches letters of cijfers 1 of meer keer achter elkaar
[A-Za-z0-9]? = Matches letters of cijfers 1 of 2 keer
En alle drie de gevallen zou hij proberen zoveel mogelijk te matchen. Een ? achter de *, + of ? betekend dat hij zo min mogelijk probeert te matchen:
[0-9A-Za-z]*? = Matches letters of cijfers 0 of meer keer, zo min mogelijk. Zonder iets ervoor en erachten zou hij dus altijd 0 keer gematched worden
[0-9A-Za-z]+? of [0-9A-Za-z]?? = Matches letters of cijfers 1 of (2 of meer keer), probeer zo min mogelijk te matchen. Zonder iets ervoor of erachter matches dit 1 keer.
Nu weer even terug naar de regex:
^ betekend het begin van een string en $ het eind, dus:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$str = 'world hello world';
preg_match('/hello/', $str); // matches 'hello'
preg_match('/world$/', $str); // matches de laatste 'world'
preg_match('/^world/', $str); // matches de eerste 'world'
?>
$str = 'world hello world';
preg_match('/hello/', $str); // matches 'hello'
preg_match('/world$/', $str); // matches de laatste 'world'
preg_match('/^world/', $str); // matches de eerste 'world'
?>
Jou regex doet eigenlijk dit:
Kijk of alles vanaf het 1e teken tot aan het laatste teken een letter, cijfer, . of - is.