preg_match positive en negative

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

09/03/2012 22:18:43
Quote Anchor link
Hallo,

Ik probeer dat preg_match een beetje onder de knie te krijgen, maar wat ik wil krijg ik niet voor elkaar.. maar misschien kan het ook wel helemaal niet.

Kun je in een preg_match aangeven dat je iets WEL wil en iets NIET? Of is het dan de bedoeling dat je voor beide situaties een aparte preg_match maakt?

Ik heb een string die cijfers, letters, punten, underscores en slashes mag bevatten, maar geen dubbele slashes en geen slash aan het eind. Ik heb nu dit:

preg_match('/^[a-z0-9.\/_]$*/i', $string);

Dit valideert of er alleen cijfers, letters, punten, underscores en slashes inzitten en werkt goed.

Om te controleren of een string eindigt op een slash kan ik dit doen:

preg_match('/\/$/', $string);

Maar kan ik deze preg_match ook negatief maken (dat er dus geen slash op het eind mag staan) en toevoegen aan de 1e preg_match? Of is dat niet mogelijk? Ik kom er niet uit... Graag advies!
Gewijzigd op 09/03/2012 22:19:37 door Ozzie PHP
 
PHP hulp

PHP hulp

24/04/2024 09:08:14
 
Wouter J

Wouter J

09/03/2012 23:28:59
Quote Anchor link
Je kan het zo doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
/[^\/]$/


Een ^ aan het begin van een charcter class ([...]) betekend NOT. Een ^ betekend op alle andere plaatsen het begin van een string.

Tevens is dit gewoon een soort copy van: http://www.phphulp.nl/php/forum/topic/path-validatie/83257/last/ ?
 
Ozzie PHP

Ozzie PHP

09/03/2012 23:32:22
Quote Anchor link
Thanks Wouter... maar kan ik dit:

preg_match('/^[a-z0-9.\/_]$*/i', $string);

en dit

/[^\/]$/

combineren tot 1 preg_match?

Of moet je dit altijd via 2 preg_matches doen?
 
Wouter J

Wouter J

09/03/2012 23:34:13
Quote Anchor link
Nee, je kan het zo uitgebreid maken als je zelf wilt.

Die regex klopt niet helemaal, die * op het eind hoort voor de $ te staan en niet erna.
 
Ozzie PHP

Ozzie PHP

09/03/2012 23:36:10
Quote Anchor link
Oké, maar als ik ze dus combineer dan krijg ik dit:

preg_match('/^[a-z0-9.\/_]*$[^\/]$/i', $string);

Maar dat werkt niet. Enig idee wat ik fout doe?
 
Wouter J

Wouter J

09/03/2012 23:41:17
Quote Anchor link
Weet je wat die $ betekend? Wat aan je regex te zien begrijp je die niet echt.
 
Ozzie PHP

Ozzie PHP

09/03/2012 23:44:39
Quote Anchor link
Die $ is toch het eind van de string?

Met /^[a-z0-9.\/_]*$ wil ik aangeven dat ie tussen het begin en eind alleen letters cijfers punten en slashen mag bevatten. En met dit stukje [^\/]$ wil ik zeggen dat ie niet mag eindigen op een slash. Ik kom er niet meer uit... :(
 
Wouter J

Wouter J

09/03/2012 23:48:43
Quote Anchor link
Ja, dus wat je zegt:

Match a-z 0-9 . / en _ tot aan het eind van een string en na het eind match je nog een keer geen \/ tot het eind.

Een $ of ^ kun je maar 1 keer gebruiken in een REGEX. Je zou het moeten combineren op deze manier:
/^[a-z0-9.\/_]*[^\/]$/i

Dit zegt matched a-z 0-9 . / _ totaan het 1 na laatste teken van een string, en dat laatste teken mag geen / zijn.
 
Ozzie PHP

Ozzie PHP

09/03/2012 23:56:06
Quote Anchor link
Hmmm, ja dit is 'm net niet...

Het probleem is... hij mag dus alleen letters cijfers punten en slashen bevatten. Alleen in dat laastste stukje zeg ik nu dus dat het laatste teken geen slash mag zijn... maar nu keurt ie dus alle tekens die geen slash zijn ook goed! Dus /pad/naar/directory! wordt nu ook goedgekeurd. En dat is dus niet de bedoeling.

Het moet dus zijn... de string mag alleen letters cijfers punten en slashen bevatten EN het laatste teken mag geen slash zijn. Heb je nog een idee?
 
Wouter J

Wouter J

10/03/2012 00:02:53
Quote Anchor link
Zie mijn reactie hier: http://www.phphulp.nl/php/forum/topic/path-validatie/83257/1/#592237

Lastig als je 2 bijna dezelfde topics opent :S
 
Mark L

Mark L

10/03/2012 10:46:31
Quote Anchor link
Inderdaad; nu pakt hij alles wat geen / is. Dit komt omdat de [^/] alles behalve een / pakt.

Jij wilt alles van [a-z0-9.\/_] behalve de slash. Dit is dus eigenlijk gewoon [a-z0-9._] toch?

Ik hoop dat deze tutorial je meer zult leren over de kracht van reguliere expressies (en hoe die te benutten)
 



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.