preg_match positive en negative
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
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/ ?
preg_match('/^[a-z0-9.\/_]$*/i', $string);
en dit
/[^\/]$/
combineren tot 1 preg_match?
Of moet je dit altijd via 2 preg_matches doen?
Die regex klopt niet helemaal, die * op het eind hoort voor de $ te staan en niet erna.
preg_match('/^[a-z0-9.\/_]*$[^\/]$/i', $string);
Maar dat werkt niet. Enig idee wat ik fout doe?
Weet je wat die $ betekend? Wat aan je regex te zien begrijp je die niet echt.
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... :(
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.
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?
http://www.phphulp.nl/php/forum/topic/path-validatie/83257/1/#592237
Lastig als je 2 bijna dezelfde topics opent :S
Zie mijn reactie hier: Lastig als je 2 bijna dezelfde topics opent :S
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)