2014-05-09 5 views
3

Comment puis-je déterminer si un chemin de fichier est absolu? Doit travailler sur Windows et Linux.Comment déterminer si un chemin de fichier est absolu?

+0

Vérifiez si elle a un colon ':'? Les chemins commençant par 'http: //', 'https: //', 'file: ///', 'C: /' sont tous absolus. Vous pouvez également voir si le chemin commence par '/' ou '~'. –

+0

@LoganMurphy Unix n'a pas –

+0

vous lisez ceci, peut-être utile? http://stackoverflow.com/questions/7392274/checking-for-relative-vs-absolute-paths-urls-in-php –

Répondre

4

Voici mon essai à le faire avec une seule fonction:

function isAbsolutePath($path) { 
    if (!is_string($path)) { 
     $mess = sprintf('String expected but was given %s', gettype($path)); 
     throw new \InvalidArgumentException($mess); 
    } 
    if (!ctype_print($path)) { 
     $mess = 'Path can NOT have non-printable characters or be empty'; 
     throw new \DomainException($mess); 
    } 
    // Optional wrapper(s). 
    $regExp = '%^(?<wrappers>(?:[[:print:]]{2,}://)*)'; 
    // Optional root prefix. 
    $regExp .= '(?<root>(?:[[:alpha:]]:/|/)?)'; 
    // Actual path. 
    $regExp .= '(?<path>(?:[[:print:]]*))$%'; 
    $parts = []; 
    if (!preg_match($regExp, $path, $parts)) { 
     $mess = sprintf('Path is NOT valid, was given %s', $path); 
     throw new \DomainException($mess); 
    } 
    if ('' !== $parts['root']) { 
     return true; 
    } 
    return false; 
} 

J'ai pris cette d'un de mon projet, vous trouverez peut-être utile tout en travaillant avec des fichiers et des chemins: dragonrun1/file_path_normalizer

+1

Vous ne voyez aucun problème avec ça. Va accepter. Merci! – mpen

+0

Ceci est une solution au copypaste d'une réponse StackOverflow. Ce qui m'intéresserait le plus serait de savoir s'il existe actuellement une solution "gagnante" ou "de facto standard" qui a existé en dehors de StackOverflow, comme une bibliothèque qui peut être installée avec un compositeur ou quelque chose du genre. Existe-t-il une bibliothèque d'utilitaires de chemin "de facto standard"? –

+0

Si vous regardez ma réponse ci-dessus, je donne un lien vers le projet que j'ai fait qui est également disponible via le compositeur. – Dragonaire

1

Voici ce que je suis venu avec:

function is_absolute_path($path) { 
    if($path === null || $path === '') throw new Exception("Empty path"); 
    return $path[0] === DIRECTORY_SEPARATOR || preg_match('~\A[A-Z]:(?![^/\\\\])~i',$path) > 0; 
} 

Je pense que couvre tous les chemins de la racine possible pour Windows.

+0

Il casse toujours pour les chemins qui ont [wrappers] (http://php.net/manual/en/wrappers.php). essayez 'zlib: // c:/dummy/path /' ou 'file: // c:/dummy/path' – Dragonaire

+0

@Dragonaire [Node] (https://nodejs.org/api/path.html#path_path_isabsolute_path) retourne 'false' pour ces deux exemples aussi, ce qui me semble être la bonne réponse. Nous parlons de chemins * file * ici, pas d'URL. – mpen

+0

Devinez que vous devez lire le lien d'emballage que je donne car ils n'ont rien à voir avec les URL en eux-mêmes. Vous pouvez les utiliser pour implémenter des choses comme ftp autour d'un flux mais vous avez ensuite file: // qui ne fait plus qu'un fichier local dans une ressource de flux au lieu d'une simple chaîne. Le fait que Node (JS) ne comprenne pas quelque chose qui est spécifique à PHP ne me surprend pas non plus;) – Dragonaire

Questions connexes