Enoncé du probleme:
Soit un site ou les url's seront du type http://www.monsite.be/site/section1/section2/section3
mais avec un nombre de sections pouvant aller de 0 (racine) à 3
J'ai fait de l'url rewrite pour que tout ce qui suit http://www/monsite.be/site/ soit redirigé sur une page index.php
pour se faire, dans le .htaccess du repertoire site, j'ai mis ceci:
Code : Tout sélectionner
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /site/index.php [L]
</IfModule>--> donc
avec une page de test index.php comme ceci:
<html>
<head><body>
<?php
echo "<p>";
echo "PHP_SELF " . $_SERVER["PHP_SELF"];
echo "<br/>REQUEST_URI " . $_SERVER["REQUEST_URI"];
echo "<br/>QUERY_STRING " . $_SERVER["QUERY_STRING"]. "</p>";
?>
</body>
</html>
j'obtiens pour l'url
http://www.monsite.be/site/europe/belgique/mons
un résultat comme celui-ci:
Code : Tout sélectionner
monsite.be ... en construction page de test
PHP_SELF /site/index.php
REQUEST_URI /site/europe/belgique/mons
QUERY_STRINGMaintenant, je voudrais parser la REQUEST_URI pour extraire les 3 variables dans un tableau qui contiendrait en index 'arg1' --> europe
'arg2' --> belgique et 'arg3" --> mons
Contraintes
1) nombre de sous-niveau variable (de 0 à 3)
2) il pourrait y avoir un / final après chaque niveau
3) il pourrait y avoir un .php après chaque niveau
( http://www.monsite.be/site/europe/belgique/mons.php )
4) Les variables doivent être suffisament générique, et pouvoir être utilisée partout ... donc, dans un tableau global, avec des index du genre arg1, arg2, arg3
Resolution
<html>
<head><body>monsite.be ... en construction new index
<?php
define('DEF_myBasePath','/news');
function RemoveExtensionOrGetVar($valeur)
{
// Note our use of ===. Simply == would not work as expected
// because the position of 'a' is the 0th (first) character.
$pos=strpos($valeur,'.');
if ($pos !== false)
{
$valeur=substr($valeur,0,$pos);
}
$pos=strpos($valeur,'?');
if ($pos !== false)
{
$valeur=substr($valeur,0,$pos);
}
return $valeur;
}
function RemoveBasePathFromRequestURI()
{
//PHP_SELF = /news/index.php
//REQUEST_URI = /news/europe/belgique/?blabla=truc&fdjdfs=dd
//this function must return /europe/belgique?blabla=truc&fdjdfs=dd
$beginPathToRemove="";
if(!defined('DEF_myBasePath'))
{
$pathindex= pathinfo($_SERVER["PHP_SELF"]);
$beginPathToRemove=$pathindex["dirname"];
}
else
{
$beginPathToRemove=DEF_myBasePath;
}
$pos=strpos($_SERVER["REQUEST_URI"],$beginPathToRemove);
if ($pos === false)
{
echo "<br/>error, returning REQUEST_URI<br/>";
return $_SERVER["REQUEST_URI"];
}
else
{
$returnstring=substr($_SERVER["REQUEST_URI"],strlen($beginPathToRemove));
return $returnstring;
}
}
function ExtractVarFromRequestUri()
{
$paramstring=RemoveBasePathFromRequestURI();
$pathvar= preg_split("/\//i", $paramstring, -1, PREG_SPLIT_NO_EMPTY);
foreach ($pathvar as $cle => $valeur)
{
$pathvar[$cle]=RemoveExtensionOrGetVar($valeur);
}
return $pathvar;
}
echo "<p>";
echo "PHP_SELF " . $_SERVER["PHP_SELF"];
echo "<br/>REQUEST_URI " . $_SERVER["REQUEST_URI"];
echo "<br/>QUERY_STRING " . $_SERVER["QUERY_STRING"];
echo "<br/>SCRIPT_FILENAME " . $_SERVER["SCRIPT_FILENAME"] . "</p>";
$pathvar3=ExtractVarFromRequestUri();
echo "<br/><br/>Fonction ExtractVar: <br/>";
print_r($pathvar3);
?>
</body>
</html>
Donc, une url du type
http://www.monsite.be/news/europe/belgique/bruxelles
sortira comme tableau de la fonction ExtractVarFromRequestUri:
Array ( [0] => europe [1] => belgique [2] => bruxelles )
http://www.monsite.be/news/europe/belgique/bruxelles/
http://www.monsite.be/news/europe/belgi ... xelles.php
http://www.monsite.be/news/europe/belgi ... true&dd=ee
retournerons le même tableau
Si la constante DEF_myBasePath est définie, on l'utilise comme base pour savoir à partir d'où extraire
ici:
define('DEF_myBasePath','/news');
si on avait fait
define('DEF_myBasePath','/');
--> On aurait eu un tableau de 4 éléments, avec news en premier
define('DEF_myBasePath','/news/europe');
--> nous aurait donné un tableau de 2 éléments avec belgique et bruxelles ...
Pas de define ... on se base sur le PHP_SELF ... qui vaut ici /news/index.php --> équivalent à define('DEF_myBasePath','/news');
et dans le cas d'une erreur du define
define('DEF_myBasePath','/truc');
on parse à partir de REQUEST_URI sans enlever le début, donc c'est équivalent à define('DEF_myBasePath','/');
====================================
========
Si votre hébergeur n'accepte pas les .htaccess ou si le mod_rewrite n'est pas activé voici une autre méthode (merci petitchevalroux)
--> il suffit d'expliciter le index.php du repertoire de base dans l'url:
Ainsi on avait avant:
http://www.monsite.be/news/europe/belgique/bruxelles
et on avait comme sortie le tableau de la fonction ExtractVarFromRequestUri:
Array ( [0] => europe [1] => belgique [2] => bruxelles )
si on l'appelle http://www.monsite.be/news/index.php/europe/belgique/bruxelles
en enlevant le .htaccess ... ca fonctionne aussi, mais y a un élément en +
Array ([0] => index.php [1] => europe [2] => belgique [3] => bruxelles )
Pour avoir le même résultat qu'avant, il faut simplement changer le define('DEF_myBasePath','/news'); en define('DEF_myBasePath','/news/index.php');
Avez-vous des commentaires, améliorations, ou autre???
merci