12
votes

Vérification des chemins / URL relatifs VS VS Absolute en PHP

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? XXX


3 commentaires

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


Vous avez oublié la fermeture d'une seule citation dans les valeurs renvoyer .


@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...


7 Réponses :


5
votes

chemins absolus et URL

Vous êtes correct, les URL absolues de Linux doivent commencer par / , donc la vérification d'une barre oblique dans le début du chemin sera suffisante.

Pour les URL, vous devez rechercher http: // et https: // , comme vous l'avez écrit, il existe plus d'URL commençant par FTP : // , sftp: // ou smb: // . Donc, c'est très en fonction de la gamme d'utilisations que vous souhaitez couvrir.

chemins et URL invalides

En supposant que vous parlez de Linux, les seuls caractères interdits interdits dans un chemin sont / et \ 0 . 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.

sous Windows, il est plus compliqué. Vous pouvez en lire à ce sujet dans le Path.getinValidPathches Méthode < / a> documentation sous remarques.

Les URL sont plus compliquées que les chemins Linux, car les caractères sont az , az , 0-9 , - , . , _ , ~ , : , / , ? , # , [, ] , @ , ! , $ , & , ', (, ) , * , + , , , ; et = ( Comme décrit dans une autre réponse ici ).

chemins relatifs et URL

En général, chemins et URL qui ne sont ni absolus ni invalides sont relatifs.


5 commentaires

Vérification d'une barre oblique de pointe est pas assez 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: \" ... Je suis venu avec l'expression régulière suivante: / ^ (?: \ / | \\ | \ w \: \\). * $ / - cela correspondra à "/ fichier" , "\ fichier" " c: \ fichier ", mais pas " fichier " ou < Code> "chemin / fichier" etc.


En fait, je me souviens d'écrire un nom de fichier qui avait un \ 0 sous Linux une fois, sur EXT3 IIRC (juste pour le plaisir). Aussi \ n 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 \: \ /). * $ . 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 : \ /). * $ /



2
votes

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: https://github.com/enrise/urihelper Ou le package Compositeur Packagsads ici: https://packagist.org/packages/enrise/urihelper

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


0 commentaires

1
votes

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);
}


1 commentaires

Que vérifiez-vous?



2
votes

de Symfony FileFeSystem Composant Pour vérifier si un chemin est absolu: < Pré> xxx


0 commentaires

3
votes

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

par exemple: xxx

sera évalué à false.

Tout ce que vous avez à faire est Ajouter

\ |

Pour interroger une partie de la regex de sorte que la fonction ressemble à: xxx

espère que cela aide quelqu'un :)


1 commentaires

Maintenant, pour la partie difficile ... Essayez d'obtenir ce correctif dans drupal :)



3
votes

Si vous savez déjà que l'URL est bien formée : xxx


0 commentaires

0
votes

Je pense que le mieux est xxx


0 commentaires