van ereg nar preg
Heb langdurug geworsteld met preg_match maar dank zij de hulp van een tut op phphulp ben ik er uitgekomen.
Mijn bewondering, ondanks de kritische woorden van anderen over enkele foutjes.
Nu de vraag:
ik wil b.v. in naamvelden alleen maar geldige tekens hebben. Dus geen tekens zoals #$%^&* etc. Daar heb ik hier noch verder op internet iets over kunnen vinden.
Kan iemand mij daarover iets vertellen?
Alvast bedankt.
Dus had je eerst: "hatsee" als pattern, dan wordt dat nu: "~hatsee~".
Voor het gemak gebruik ik de tilde als teken. Deze heeft geen botsende betekenis in reguliere expressies.
Dat is wat ik er even in en notendop over kwijt wou.
Met "~[^a-zA-Z]~" zou je dan alleen maar grote en kleine letters toestaan.
Gewijzigd op 27/07/2013 18:10:14 door - Ariën -
In persoons- en plaatsnamen moeten de apostrophe ende spatie kunnen voorkomen en dat bleek aanvankelijk een probleem. De apostrophe kan door er regex tussen dubbele quotes te zetten. Ik ben aan de hand van de phphulp tut gekomen op(.+)en (.*) in de regex, maar daardoor worden ook die bijzondere tekens toegelaten.
Of ik dat met ~ oplos? Moet ik nog wat op zien te vinden. Een methode om bepaalde tekens niet toe te laten heb ik nog niet gevonden.
Ik raad altijd aan om {} te gebruiken als delimeters. Het is de slimste delimeter en je hoeft geen één character te escapen.
Door een ^ als eerste character in character class ([]) te zetten zeg je, deze mogen niet. Je kan het natuurlijk ook juist wel matchen en dan kijken of hij wel matched en als dat zo is een foutmelding tonen.
Als je dus @%$&^ niet wilt hebben in een string dan wordt je regex: /[^@%$&^]/
Ah, daar was het dakje voor bedoeld. Ben zelf geen kei in reguliere expressies merk ik ;-)
Dat is inderdaad de manier.Mijn dank voor die ophelderende reactie.
Het had wel wat voeten in de aard om zo'n preg_match in een functie werkend te krijgen maar dat lukte toen ik me bedacht dat als er een match wordt gevonden dat betekent dat er zo'n teken in de string voorkomt.
Nu wil ik een paar stukjes code plaatsen, maar weet niet hoe ik die met de regelnummers geplaatst krijg.
Kan iemand mij dat vertellen?
Gewijzigd op 28/07/2013 18:22:50 door Ger van Steenderen
En als je toch al php tags plaatst kun je net zo goed de code tags overslaan
Dat gaat om plaatsnamen en om persoonsnamen in een veld op een formulier.
Met de circomflex ^ aan het begin van een Class in de regex van een preg_match dus niet gevonden. Mijn aanvankelijke gedachtengang was fout. Het gaat er juist om die teens wel te vinden en dan de naam af te keuren.
Daarom heb ik (na zwoegen) de volgende regex opgesteld:
1
Als er uit die reeks een teken wordt gevonden geeft de preg_match een 0 (nul) en dan is de naam dus niet goed ingevoerd.
Dat heb ik geplaats in en scriptje om het te testen:
1
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
2 // te toetsen naam
3 $trial = "'&-Gra@venhage";
4 //Uit te proberen regex
5 $len = strlen($trial);
6 $regex = "{[\.~%&_:<>=\{\}\[\]\(\)\^\$\|*\+\?\/]}";
7 preg_match($regex, $trial, $matches);
8 print_r($matches)."<br>";
9 echo count($matches)."<br>";
10 if (count($matches) > 0)
11 {
12echo "geen correcte naam";
13 }
14 else
15{
16 echo "correcte naam";
17 }
18 ?>
2 // te toetsen naam
3 $trial = "'&-Gra@venhage";
4 //Uit te proberen regex
5 $len = strlen($trial);
6 $regex = "{[\.~%&_:<>=\{\}\[\]\(\)\^\$\|*\+\?\/]}";
7 preg_match($regex, $trial, $matches);
8 print_r($matches)."<br>";
9 echo count($matches)."<br>";
10 if (count($matches) > 0)
11 {
12echo "geen correcte naam";
13 }
14 else
15{
16 echo "correcte naam";
17 }
18 ?>
Tot nu toe werkt het.
Dank aan degenen die daarbij ebben geholpen.
Op internet heb ik meerdere scripts gevonden voor naam-validatie. Bijna allemaal staan ze gewoon alle tekens toe en dat is dus niet de bedoeling.
Toevoeging op 29/07/2013 06:21:58:
Ik zie dat ik de regelnummering niet had hoeven invoeren.
Toevoeging op 29/07/2013 06:30:31:
Ik zie dat ik regel 5 $len heb vergeten te verwijderen. Die was ven een vorige poging blijven staan