nettoyer_segment() dans chemin.php + petites modifications.
This commit is contained in:
parent
e279e497ab
commit
6280525d34
|
@ -3,16 +3,16 @@
|
||||||
require_once(dirname(__FILE__) . "/path.php");
|
require_once(dirname(__FILE__) . "/path.php");
|
||||||
|
|
||||||
class Chemin {
|
class Chemin {
|
||||||
// Si $chemin est un tableau, il doit vérifier les invariants de nettoyer_chemin.
|
// Si $chemin est un tableau, chaque segment doit vérifier les invariants de nettoyer_segment.
|
||||||
public function __construct($chemin) {
|
public function __construct($chemin) {
|
||||||
if (! is_array($chemin)) {
|
if (! is_array($chemin)) {
|
||||||
$this->segments = explode('/', self::nettoyer_chemin($chemin));
|
$this->segments = self::nettoyer_chemin($chemin);
|
||||||
} else {
|
} else {
|
||||||
$this->segments = $chemin;
|
$this->segments = $chemin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function correspond(motif, chemin) {
|
public function correspond($motif) {
|
||||||
// motif : liste de segments, pouvant être un chaîne ou un jocker
|
// motif : liste de segments, pouvant être un chaîne ou un jocker
|
||||||
// correspondant à "n'importe quelle chaîne pour ce segment". Le
|
// correspondant à "n'importe quelle chaîne pour ce segment". Le
|
||||||
// dernier segment peut être le joker "n'importe quelle suite de
|
// dernier segment peut être le joker "n'importe quelle suite de
|
||||||
|
@ -20,7 +20,24 @@ class Chemin {
|
||||||
// dans ce cas-là).
|
// dans ce cas-là).
|
||||||
// chemin : liste de segments.
|
// chemin : liste de segments.
|
||||||
|
|
||||||
// les segments de chemin et motif sont déjà nettoyés.
|
// SÉCURITÉ : les segments de chemin et motif sont déjà nettoyés.
|
||||||
|
|
||||||
|
if ((count($motif) != count($this->segments)) && (end($motif) != CHEMIN_JOKER_MULTI_SEGMENTS)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for ($i = 0; $i < count($motif); i++) {
|
||||||
|
if ($motif[$i] == CHEMIN_JOKER_MULTI_SEGMENTS) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($motif[$i] == CHEMIN_JOKER_SEGMENT) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($motif[$i] == $this->segments[$i]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invariant de sécurité : la chaîne renvoyée ne commence ni ne
|
// Invariant de sécurité : la chaîne renvoyée ne commence ni ne
|
||||||
|
@ -31,7 +48,10 @@ class Chemin {
|
||||||
|
|
||||||
public function enfant($nom) {
|
public function enfant($nom) {
|
||||||
$s = $this->segments;
|
$s = $this->segments;
|
||||||
array_push($s, self::nettoyer_segment($nom));
|
$x = self::nettoyer_segment($nom)
|
||||||
|
if ($x != '') {
|
||||||
|
array_push($s, $x);
|
||||||
|
}
|
||||||
return new self($s);
|
return new self($s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,28 +65,38 @@ class Chemin {
|
||||||
|
|
||||||
|
|
||||||
public static function nettoyer_chemin($chemin) {
|
public static function nettoyer_chemin($chemin) {
|
||||||
// SECURITE : $chemin nettoyé
|
// SÉCURITÉ : $chemin nettoyé
|
||||||
// * Ne contient pas '\0'
|
// * Ne contient pas '\0'
|
||||||
// * Ne contient pas '../'
|
// * Ne contient pas '../'
|
||||||
// * Ne contient pas de double occurence de '/'
|
// * Ne contient pas de double occurence de '/'
|
||||||
// * Ne contient pas __prop__
|
|
||||||
// * Ne se termine pas par '/'
|
// * Ne se termine pas par '/'
|
||||||
// * Ne commence pas par '/'
|
// * Ne commence pas par '/'
|
||||||
// * Ni d'autres bizarreries des chemins de fichiers.
|
// * Est découpé en segments
|
||||||
|
// * Chaque segment est nettoyé avec nettoyer_segment().
|
||||||
|
|
||||||
$chemin = preg_replace("/\\0/", '', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
$chemin = preg_replace("/\\0/", '', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
||||||
$chemin = Path::normalize($chemin);
|
$chemin = Path::normalize($chemin);
|
||||||
$chemin = preg_replace("/__prop__/", '___prop___', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
$chemin = preg_replace("/^\\/*/", '', $chemin);
|
||||||
$chemin = preg_replace("/^\/*/", '', $chemin);
|
$chemin = preg_replace("/\\/*$/", '', $chemin);
|
||||||
$chemin = preg_replace("/\/*$/", '', $chemin);
|
|
||||||
|
|
||||||
// TODO
|
$segments = explode('/', $chemin);
|
||||||
return $chemin;
|
$segments = array_map("nettoyer_segment", $segments)
|
||||||
|
|
||||||
|
return $segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function nettoyer_segment($segment) {
|
public static function nettoyer_segment($segment) {
|
||||||
// TODO. Ne doit pas être vide, remplacer par _vide_ sinon.
|
// SÉCURITÉ : $segment nettoyé :
|
||||||
// Ne doit pas contenir '*' non plus. Remplacer par '-'
|
// * /!\ Peut être vide /!\
|
||||||
|
// * Ne doit pas contenir '/' non plus, remplacer par '-'.
|
||||||
|
// * Ne doit pas contenir '*' non plus, remplacer par '-'.
|
||||||
|
// * Ne contient pas "__prop__", remplacer par "___prop___".
|
||||||
|
|
||||||
|
$segment = preg_replace("/\\0/", '', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
||||||
|
$segment = preg_replace("/\\//", '', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
||||||
|
$segment = preg_replace("/\\*/", '', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
||||||
|
$segment = preg_replace("/__prop__/", '___prop___', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???)
|
||||||
|
return $segment;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user