Nu zit ik een beetje moeilijk te doen om eerst te controleren of het ingegeven pad een string is, of er ongeldige karakters in staan, of het pad niet leeg is enz.
Volgens mij ben ik veel te omslachtig bezig. Ik vraag me dan ook af of PHP standaard een pad validatie functie kent. Of wellicht weet iemand hier een handige preg_match voor? Een pad mag alleen bestaan uit cijfers en letters en mag underscores en forward slashes bevatten, maar geen dubbele forward slashes.
Nog een klein extra vraagje. Geen idee of iemand dit weet... Stel je controleert zo'n pad via een functie of via preg_match, maar in plaats van een string wordt er een boolean of object ingegeven (omdat een programmeur ligt te slapen), resulteert dit dan in een warning? Of ziet de preg_match functie van hé, dit is geen string en handelt ie het dan gewoon netjes af?
Dit /mijn/pad!naar@ / was puur bedoeld als een voorbeeld... waarmee ik duidelijk wilde maken dat er geen ongeldige tekens in het pad mogen staan. Het gaat dus niet om dat ! of @. Dat was puur een voorbeeld.
?
Onbekende gebruiker
09-03-2012 22:35
Dat begrijp ik, maar wat is de reden dat je hierop wilt controleren?
Moet iemand een pad kunnen toevoegen, of wil je controleren of een url bestaat?
je kan dit misschien gebruiken maar dan moet je er wel een bestand bij zetten:
<?php
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
In mijn cms kan een programmeur paden naar bepaalde directories toevoegen. Ik wil valideren of die paden voldoen aan het juiste formaat. Het gaat er dus niet om of de directory wel of niet bestaat. Het gaat er alleen om of het een geldig "formaat" is.
Dit is een geldig pad: 'pad/naar/directory'.
Maar dit bijvoorbeeld niet: 'pad / naar/directory'.
En dit ook niet 'pad@naar/directory';
Ik wil een preg_match waarmee ik kan controleren of:
1. het pad mag bestaan uit: letters, cijfers, underscores, forward slashes, punten
2. het pad mag niet eindigen op een slash
3. er mogen geen dubbele slashes in zitten
Daar moet ik dus een preg_match voor hebben.
Ik ben inmiddels zover dat ik een preg_match heb die controleert op punt 1 (zie hierboven).
preg_match('/^[a-z0-9.\/_]$*/i', $pad);
Maar ik heb geen idee hoe ik punt 2 en 3 in diezelfde preg_match krijg...
Voorbeeld: http://regexr.com?309bb (die global en multiline flags zijn slechts voor het juist testen en moet je dus niet gebruiken)
Even een uitleg:
/../ een regex
^ match vanaf het begin van een string
(a|b) match a of b
[a-z0-9._-] match a-z 0-9 . _ -
\/(?!\/) match een backslash (\/) die niet wordt gevolgt door nog een backslash ((?!..) is een negative lookahead)
()* match de group 0 of meer keer, zo vaak mogelijk
[^\/]$ match geen \/ als laatste teken van de string ($ = laatste teken)
Ik heb nog even - toegevoegd. Een - hoort in een url thuis, een _ niet.
De laatste character class zorgt ervoor dat het alleen a-z 0-9 . _ - als laatste teken mag hebben en geen backslash. Eventueel kan je dit nog stricter maken door ook . _ en - te verbieden als laatste teken.
Haha... lol zeg... wat een ellende :D Ik had misschien beter geen biertje kunnen drinken ;)
Het lijkt nu in ieder geval te werken. Kan ik straks weer rustig slapen... zucht...
Waarom hoort een _ niet in een url thuis? In de meeste gevallen heb je denk ik wel gelijk, maar iemand zou een directory toch "_private" kunnen noemen of "mijn_directory"?
[size=xsmall]Toevoeging op 10/03/2012 00:23:17:[/size]
P.S.
([a-z0-9._\-]|\/(?!\/))
Wat is de rol van de (dikgedrukte) slash? Ik zie geen verschil als ik m weghaal?