van ereg nar preg

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Georg Kellersmann

Georg Kellersmann

27/07/2013 17:34:07
Quote Anchor link
Ben geen prof en ben er dus ook niet elke dag met preg_match ter vervanging van ereg's en eregi' bezig. Zo stonden er in mijn scripts dus alleen maar ereg's en eregi's.
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.
 
PHP hulp

PHP hulp

25/04/2024 17:33:58
 
- Ariën  -
Beheerder

- Ariën -

27/07/2013 18:09:52
Quote Anchor link
Het komt er op neer dat elke pattern die je aan de preg_match() voert, nu een delimiter meekrijgt aan beide kanten.

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 -
 
Georg Kellersmann

Georg Kellersmann

27/07/2013 18:29:37
Quote Anchor link
Bedankt.
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.
 
Wouter J

Wouter J

27/07/2013 22:16:51
Quote Anchor link
Aar, met [^a-zA-Z] zou je juist geen grote en kleine letters toestaan.

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: /[^@%$&^]/
 
- Ariën  -
Beheerder

- Ariën -

27/07/2013 22:38:47
Quote Anchor link
Ah, daar was het dakje voor bedoeld. Ben zelf geen kei in reguliere expressies merk ik ;-)
 
Georg Kellersmann

Georg Kellersmann

28/07/2013 18:09:51
Quote Anchor link
@Wouter J
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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

28/07/2013 18:22:02
Quote Anchor link
Zet het tussen [code] en [/code] tags. Niet vergeten om ook de php openings en sluitings tags er in te zetten als de code die je plaatst die niet bevat, anders krijg je wel regel nummers maar geen kleurtjes.
Gewijzigd op 28/07/2013 18:22:50 door Ger van Steenderen
 
Wouter J

Wouter J

28/07/2013 21:25:14
Quote Anchor link
En als je toch al php tags plaatst kun je net zo goed de code tags overslaan
 
Georg Kellersmann

Georg Kellersmann

29/07/2013 06:20:08
Quote Anchor link
Het doel van dit script was een naam te testen op tekens die niet in een naam thuishoren.
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
2 $regex
= "{[\.~%&_:<>=\{\}\[\]\(\)\^\$\|*\+\?\/]}";
3 ?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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 ?>


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.