2010-08-03 5 views
4

En PHP Je reçois une chaîne de l'utilisateur pour un répertoire de fichiers local $pathVérifiez si le chemin du répertoire se termine par DIRECTORY_SEPARATOR

Je veux savoir s'ils ont inclus la barre oblique (/) ou non. Je voudrais que ce soit la plate-forme croix donc je voudrais utiliser le PHP DIRECTORY_SEPARATOR

constante Mon tentatives ratées comprennent essayer de faire un preg_match comme

preg_match("/" . DIRECTORY_SEPARATOR . "$/", $path); 

Je fondamentalement veux juste une façon élégante de tester si la chaîne se termine par DIRECTORY_SEPARATOR.

Répondre

16

Pour fixer votre regexp:

preg_match("/" . preg_quote(DIRECTORY_SEPARATOR) . "$/", $path); 

Mais il peut être plus simple des moyens pour atteindre votre objectif:

rtrim($path,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; 
+0

+1 Belle solution propre. (Comme le mien, il échouera si DIRECTORY_SEPARATOR n'est pas un seul caractère, mais je n'ai pas encore vu un OS qui causerait des problèmes.) –

+0

Je pensais ne pas utiliser '/' pour le délimiteur regexp, mais en effet, qui sait quoi DIRECTORY_SEPARATOR peut être inventé dans les années à venir ... – mvds

+0

btw cela ne va pas échouer sur DIRECTORY_SEPARATOR multi-char, car il va couper du séparateur entier. (bien, ok, si le dernier caractère du nom de fichier serait un caractère contenu dans le DIRECTORY_SEPARATOR multi-caractères ... mais ce serait très obscur) – mvds

0

Une façon de travailler trival ceci serait d'utiliser ...

$sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false; 

... ce qui serait beaucoup plus efficace qu'une expression régulière. Là encore, cela échouera si DIRECTORY_SEPARATOR n'est pas un seul caractère.

+0

'substr ($ path, -1)' serait à son tour plus efficace que '$ path {strlen ($ path) - 1}' – mvds

-1

Je pense que selon la plate-forme, vous pouvez vous retrouver avec une expression régulière invalide sur le premier argument.

Votre solution est élégante par conception. Beau codage. Mais rappelez-vous que les séparateurs de répertoire sont généralement des caractères spéciaux. Il peut avoir besoin de s'échapper.

EDIT # 1 J'ai bien aimé la solution proposée

$sepPresent = $path{strlen($path) - 1} == DIRECTORY_SEPARATOR ? true : false; 

Et pour travailler dehors, je suggère:

$sepPresent = $path{strlen($path) - strlen(DIRECTORY_SEPARATOR)} === DIRECTORY_SEPARATOR ? true : false; 
+0

Ceci ne sera pas travaille pour multi-char, puisque '$ chemin {..}' obtient 1 char seulement. mieux utiliser 'substr ($ path, -strlen (DIRECTORY_SEPARATOR))'. – mvds

+0

ouais, mon mauvais ... – Dave

0

pourrait également utiliser la notation d'accès au tableau

$endsInDS = $str[strlen($str)-1] === DIRECTORY_SEPARATOR; 
1

ce qui est faux avec un simple substr($path,-1)==DIRECTORY_SEPARATOR?

+0

il ferait l'affaire mais encore une fois, je pense que le séparateur de répertoire de craintes d'asker pourrait changer dans le futur. Il pourrait ne pas y avoir plus d'un caractère de longueur, mais plus, à savoir: – fabjoa

+1

à moins que le monde ne recule, je ne vois aucune raison pour qu'un monde demande plus de caractères à taper sur la ligne de commande – stillstanding

Questions connexes