Je dois mettre en œuvre des fonctions pour vérifier si les chemins et les URL sont relatifs, absolus ou invalides (non valides syntaxiquement, non si la ressource existe). Quelles sont la gamme de cas que je devrais rechercher?
7 Réponses :
Vous êtes correct, les URL absolues de Linux doivent commencer par Pour les URL, vous devez rechercher En supposant que vous parlez de Linux, les seuls caractères interdits interdits dans un chemin sont sous Windows, il est plus compliqué. Vous pouvez en lire à ce sujet dans le Path.getinValidPathches Méthode < / a> documentation sous remarques. P>
Les URL sont plus compliquées que les chemins Linux, car les caractères forts> forts> sont En général, chemins et URL qui ne sont ni absolus ni invalides sont relatifs. P> / code>, donc la vérification d'une barre oblique dans le début du chemin sera suffisante. P>
http: // code> et
https: // code>, comme vous l'avez écrit, il existe plus d'URL commençant par
FTP : // code>,
sftp: // code> ou
smb: // code>. Donc, c'est très en fonction de la gamme d'utilisations que vous souhaitez couvrir. P>
/ code> et
\ 0 code>. C'est en fait très dépendant du système de fichiers, cependant, vous pouvez assumer ce qui précède pour être correct pour la plupart des utilisations. P>
az code>,
az code>,
0-9 code >,
- code>,
. code>,
_ code>,
~ code>,
: code>,
/ code>,
? code>,
# code>,
[ code>,
] code>,
@ code> ,
! code>,
$ code>,
& code>,
' code>,
( code>,
) code>,
* code>,
+ code>,
, code>,
; code> et
= code> ( Comme décrit dans une autre réponse ici ). P>
Vérification d'une barre oblique de pointe est pas assez i> suffisamment si vous vous attendez à ce que vos scripts PHP soient portables vers d'autres plates-formes - des chemins absolus sous Windows peuvent commencer par une barre oblique inverse ou "C: \" code> ... Je suis venu avec l'expression régulière suivante:
/ ^ (?: \ / | \\ | \ w \: \\). * $ / Code> - cela correspondra à
"/ fichier" code>,
"\ fichier" code ",
" c: \ fichier " code>, mais pas
" fichier " code> ou < Code> "chemin / fichier" code> etc.
En fait, je me souviens d'écrire un nom de fichier qui avait un \ 0 code> sous Linux une fois, sur EXT3 IIRC (juste pour le plaisir). Aussi
\ n code> dans un nom de fichier fonctionne, ces deux choses peuvent casser 99% des scripts (sans parler de la moitié d'entre eux déjà casser si les chemins ont des espaces lol).
Hey @ mindplay.dk, votre regex ne fonctionne pas pour C: /. Mais cela fonctionne pour C: \. Maintenant, dans Windows, c: / Les chemins sont également légitimes! Des idées comment réparer?
J'ai ajouté un supplément en option pour corriger: ^ (?: \ / | \\ | \ w \: \\ | \ w \: \ /). * $ Code>. Il reconnaît maintenant c: /.
Puisque tente de le faire fonctionner sur PHP, en raison de la façon dont PHP n'échappe que les backslashes backslashes, le regex doit être converti en ^ (?: \ / | \\\\\ | \ w: \\\\\\ | \ w : \ /). * $ code> /
J'ai récemment lancé un package compositeur qui pourrait être utile pour vérifier que les URL de Wether URL sont relatifs / absolus (et plus de succès).
Consultez le référentiel ici: Quelques exemples: P> $uri = new \Enrise\Uri('http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment');
echo $uri->getScheme(); // http
echo $uri->getUser(); // usr
echo $uri->getPass(); // pss
echo $uri->getHost(); // example.com
echo $uri->getPort(); // 81
echo $uri->getPath(); // /mypath/myfile.html
echo $uri->getQuery(); // a=b&b[]=2&b[]=3
echo $uri->getFragment(); // myfragment
echo $uri->isSchemeless(); // false
echo $uri->isRelative(); // false
$uri->setScheme('scheme:child:scheme.VALIDscheme123:');
$uri->setPort(null);
echo $uri->getUri(); //scheme:child:scheme.VALIDscheme123:usr:pss@example.com/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment
Cette fonction est prise à partir de DRUPAL
public function is_absolute($url) { $pattern = "/^(?:ftp|https?|feed):\/\/(?:(?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)* (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@)?(?: (?:[a-z0-9\-\.]|%[0-9a-f]{2})+|(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\]))(?::[0-9]+)?(?:[\/|\?] (?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)?$/xi"; return (bool) preg_match($pattern, $url); }
Que vérifiez-vous?
de Symfony FileFeSystem Composant Pour vérifier si un chemin est absolu: < Pré> xxx pré> p>
Puisque je ne peux pas commenter les réponses en raison de ma mauvaise réputation, je dois répondre à Ymakux Répondre avec la fonction qu'il a copiée de la bibliothèque de Drupal.
J'utilise cette fonction et j'ai découvert que les URL avec une partie de requête (texte après? symbole) qui contient | Le symbole sera évalué à false p>
par exemple: p> sera évalué à false. p> Tout ce que vous avez à faire est Ajouter p> \ | p>
blockQuote> Pour interroger une partie de la regex de sorte que la fonction ressemble à: p> espère que cela aide quelqu'un :) p> p> P>
Maintenant, pour la partie difficile ... Essayez d'obtenir ce correctif dans drupal :)
Je pense que le mieux est
Nashruddin.com/... Prenez les résultats de la fonction détaillée dans ce lien et comparez les résultats avant / après. Si cela a changé, vous avez probablement eu une URL relative
ocd> code>
@Marc B- tandis que ce lien a des parties utiles, cela ne fonctionnera pas comme si je ne sais pas ce que la base de l'URL est transmise à moi, je ne serai pas en mesure de faire correspondre il...