Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/08/2007, 03h42   #1
Inactif
 
Avatar de CR_Gio
 
Inscription : septembre 2005
Messages : 1 196
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 1 196
Points : 1 201
Points : 1 201
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 :
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
CR_Gio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 08h46   #2
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
utilise la fonction http://fr2.php.net/manual/fr/function.parse-url.php
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 11h36   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
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");
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 02h37   #4
Inactif
 
Avatar de CR_Gio
 
Inscription : septembre 2005
Messages : 1 196
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 1 196
Points : 1 201
Points : 1 201
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 :
$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 :
$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
CR_Gio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 08h45   #5
Inactif
 
Avatar de CR_Gio
 
Inscription : septembre 2005
Messages : 1 196
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 1 196
Points : 1 201
Points : 1 201
bon je pose ma solution quand meme .... :/

Code :
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 :
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]);
}
CR_Gio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 09h42   #6
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
remplace ".*" par ".*?"
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 10h14   #7
Inactif
 
Avatar de CR_Gio
 
Inscription : septembre 2005
Messages : 1 196
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 1 196
Points : 1 201
Points : 1 201
Tout d'abor merci pour toute l'aide que tu m'apporte

Code :
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 :
Citation:
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é : (.*)? )
CR_Gio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 10h16   #8
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
ah lol c'est pcq tu utilise preg (sic)
Utilise plutot preg_match ^^

Code :
$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 ^^
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 10h47   #9
Inactif
 
Avatar de CR_Gio
 
Inscription : septembre 2005
Messages : 1 196
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 1 196
Points : 1 201
Points : 1 201
Ho que c'est bon lol

Ca match ^^

Code :
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
CR_Gio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 12h48   #10
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
pas de quoi
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h48.


 
 
 
 
Partenaires

Hébergement Web