IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Décomposer le chemin d'une URL [RegEx]


Sujet :

Langage PHP

  1. #1
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut Décomposer le chemin d'une URL
    Bonsoir a tous,

    j'ai une url du type /folder/file.ext (folder pouvant representer une suite de sous repertoir )

    je souhaierais vérifier si cette URL verifie l'un des "motife" suivant :
    • /folder
    • /folder/
    • /a_file.php
    • /folder/.../folder
    • /folder/.../folder/
    • /folder/.../a_file.php


    et récuperer le chemin et le nom-de-base du fichier ( sans l'extension ) là est mon probleme ...

    J'ai essayé pas mal de chose, mais il doit y avoir encore des trucs qui m'échape.

    La premier chose sur laquel je bloque est de vérifier si l'URL fini par / ou .php et du coup , récuperer le reste de l'url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /*
    // motife valide :
    //=======================
     /folder
     /folder/
     /a_file.php
     /folder/.../folder
     /folder/.../folder/
     /folder/.../a_file.php
    */
    $str='/folder/file.php';
    $regex='^(.*)(/|\.php)?$';// le ' ? ' finale pose des probleme :?
     
    if (ereg ($regex, $str, $regs)) {
        for($i=0;$i<sizeof($regs);$i++)
          echo $i.'->'.$regs[$i].'<br>';
    }
    /*
    // OutPut :
    //========================
    0->/folder/file.php
    1->/folder/file.php
    2->
    */
    // $regs[0] correspond a la chaine traité
    PS : Je pensais que $reg[2] ( dans cette exemple) devait m'afficher .php . Mais j'ai l'impression que le (.*) qui precede le (/|\.php)? l'emporte a cause du ? car si je l'enleve ou que je met un + ca marche mais plus pour le cas ou url = /folder

  2. #2
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $parts = preg_split('~/|' . preg_quote(DIRECTORY_SEPARATOR) . '~', /*realpath(*/$chemin/*)*/, -1, PREG_SPLIT_NO_EMPTY);
    if (count($parts) > 2) {
        $base = array_shift($parts);
        $fichier = pathinfo($chemin, PATHINFO_FILENAME); /* Le deuxième paramètre requiert une version >= 5.2.0 */
    } else {
        die("Houston on a un problème");
    }

  4. #4
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut " Houston on a un problème "
    Merci pour toute ses réponses

    Citation Envoyé par Korko
    utilise la fonction parse-url
    J'utilise la variable $_SERVER['REDIRECT_URL'] donc la fonction parse-url ne m'est d'aucune aide ( $_SERVER['REDIRECT_URL'] est "le" resultat de parse_url() ) mais merci

    julp j'ai étudier le code que tu a gracieusement poster; Il a du bon il a du moins bon aussi ...

    Mais ca ne résoud toujours pas mon probleme

    Je souhaitai vérifier si une chaine vérifiait un de ces format d'url :
    /folder
    /folder/
    /a_file.php
    /folder/.../folder
    /folder/.../folder/
    /folder/.../a_file.php
    Et si la chaine vérifie ce format, récuerer la chaine correspondante en rouge (folder et a_file represente nimporte quell chain ascci)

    Ce qui ce rapproche le plus de ce que je voulai est cette expression reguliaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex='/(.*[^/^(\.php)])(/|\.php)?$';
    Maleuresement, le motif ne vérifie pas /folder/a_file.php/ ni /folder/a_file// ( ce qui est moins grave )

    Et je ne comprend pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex='^(.*)(/|\.php)?$'
    ne répond pas a mon probleme.

    Enfin bref. je n'y arrive pas... Soyons pragramatique, je vais collé 100 lignes de code au lieu de 2 ( julp )

    PS: Si vous avez la réponse ca serrai vraiment cool de la partager

  5. #5
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    bon je pose ma solution quand meme .... :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $str=$_SERVER['REDIRECT_URL'];
    $pathinfo = pathinfo($str);
     
    if( isset($pathinfo['dirname']) && !empty($pathinfo['dirname']) )
      $path=preg_split('~/~', $pathinfo['dirname'], -1, PREG_SPLIT_NO_EMPTY);
    if( isset($pathinfo['basename']) && !empty($pathinfo['basename']) )
      if( isset($pathinfo['extension']) && !empty($pathinfo['extension']) )
      {
        $basenamelen=strlen($pathinfo['basename']);
        $extensionlen=strlen($pathinfo['extension']);
        array_push ($path, substr($pathinfo['basename'], 0, $basenamelen-$extensionlen-1));
      }
      else
        array_push ($path, $pathinfo['basename']);
     
     
    // testé sous
    // PHP 5.xxx
    // apache 2.xx
    // linux ......
    Et ca me coute 50 milliseconde


    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pathArray=array();
    $str=$_SERVER['REDIRECT_URL'];
    $regex='^/(.*)(/|\.php)?$';// (/|\.php) n'ai pas pris en compte a cause du couple (.*), ?
    if( ereg($regx, $str, $regs) )
    {
      $pathArray=split(regs[1]);
    }

  6. #6
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    remplace ".*" par ".*?"

  7. #7
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    Tout d'abor merci pour toute l'aide que tu m'apporte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $pathArray=array();
    $str=$_SERVER['REDIRECT_URL'];// /home/directory/file.php
    $regex="^/(.*?)(/|\.php)?$";
    if( ereg($regex, $str, $regs) )
    {
      $pathArray=split('/', $regs[1]);
      echo '<pre>';
      print_r($regs);
      echo '</pre>';
    }
    ?>
    ce code me retourne une erreur :
    Warning: ereg() [function.ereg]: REG_BADRPT in /var/www/html/home/directory/file.php on line 24
    J'ai vue dans un poste que tu avais deja spécifié ce type de motife. Je pense comme php que ce n'ai pas correcte. Peux tu me dire quel version utilise tu ?

    ( j'ai également essayé : (.*)? )

  8. #8
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    ah lol c'est pcq tu utilise preg (sic)
    Utilise plutot preg_match ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex="#^/(.*?)(/|\.php)?$#";
    Et (.*?) est totalement différent de (.*)? ^^

    .*? veux dire qu'il doit s'arreter dès que le test suivant est bon. Sans le ?, il ne s'arrete QUE quand celui ci n'est plus bon ce qui est bien différent ^^
    .* est toujours valide donc evidemment, il englobe ce que tu donne apres ^^

  9. #9
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    Ho que c'est bon lol

    Ca match ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $pattern="#^/(.*?)(/|\.php)?$#";
    $subject = '/home/directory/file.php';
    if( preg_match($pattern, $subject, $matches) )
    {
      echo '<pre>';
      print_r($matches);
      echo '</pre>';
    }
    résultat : 50 microseconde

    Citation Envoyé par CR_Gio
    Et ca me coute 50 milliseconde
    1000 fois merci

  10. #10
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    pas de quoi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Webbrowser: accéder à une URL sans télécharger ses composants
    Par gabuzomeu1 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 19/11/2014, 19h50
  2. Réponses: 2
    Dernier message: 01/06/2011, 10h49
  3. Transformer une URL en chemin windows
    Par Wells dans le forum VB.NET
    Réponses: 6
    Dernier message: 26/10/2007, 10h56
  4. [html, balise form] comment composer une url sans le "?"
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 29/01/2007, 03h50
  5. Réponses: 2
    Dernier message: 06/10/2005, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo