Ola mensen,

Ik wil valideren of een (ingegeven) pad geldig is. Met een pad bedoel ik dit:

$pad = '/mijn/pad/naar/een_of_andere_directory/in/subdirectory/12';

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?
Kan je met is_dir() en is_file() niet gewoon kijken of het iets geldigs teruggeeft?
Zo nee, fout. Zo ja: prima.
En als je gewoon controleerd met is_dir, file_exists en is_string?
Nee... dat is niet de bedoeling. Ik wil daadwerkelijk controleren of er een geldig pad is ingegeven, of de structuur klopt.

Als iemand een pad toevoegt dan wil ik controleren of de structuur klopt. Dus als iemand invult:

/mijn/pad!naar@ /

dan moet dat worden afgekeurd.
Sorry, maar ik begrijp niet waarom je dit zou willen controleren, waarom wil je dat iemand een pad kan invoeren?

Zo zou je het kunnen controleren:

<?php
$regex = '/(!|@)/i';

if (preg_match($regex, '/mijn/pad!naar@ /')) {
echo 'wrong path name';
} else {
echo 'path is ok';
}
?>
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.
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";
}
?>
@Phoenix:

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...
Ik zou dit gebruiken:
/^([a-z0-9._\-]|\/(?!\/))*[^\/]$/i

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.

[hr]
Na aanleiding van deze reactie in het andere topic heb ik nu deze regex, deze werkt volgens mij volledig naar jou wensen: http://regexr.com?309bh
/^([a-z0-9._\-]|\/(?!\/))*[a-z0-9._-]$/i

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?

Reageren