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 06/10/2006, 23h03   #1
Invité de passage
 
Inscription : août 2004
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 4
Points : 1
Points : 1
Par défaut Réecriture automatique d'URL

Bonsoir à tous,

Je suis en train de développer un site, en utilisant l'URL rewriting. Mais au lieu d'écrire l'url modifié dans le code HTML, je veux que ça soit automatique en utilisant les expressions régulières avec preg_match_all() et le remplacement avec sprintf().

exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
 
<?php
//code simplifié
 
$url="index.php?lg=fr";
 
function rewriteURL($url) {
 
	$extension=".html";
 
	if(preg_match_all("#index\.php\?lg=([a-z]{2})#Ui", $url, $matche, PREG_PATTERN_ORDER)) {
		$format="lg-%s";
		return sprintf($format, $matche[1][0]).$extension;
	}
 
	return $url;
}
 
echo rewriteURL($url);
?>
Dans ce cas, l'url est bien retournée. Mais en ayant par exemple :

$url = "index.php?lg=fr&test=toto";

L'url retourné est celle donné par sprintf, et non pas du dernier return (comme je l'esperais) qui devrait être l'url de départ.
J'ai bien mis l'option Ungreedy, mais ça déconne quelque part (enfin, c'est moi plutôt) et je n'arrive pas a trouver ou.

L'idée est d'avoir plusieurs if avec des preg_match_all et de trouver la regex qui correspond à l'URL, mais si ça bloque déjà sur la première regex ça va pas :/
Surfoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2006, 23h18   #2
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
Vous devriez ajouter dans ce cas les ancrages de début (^) et fin de ligne (ou texte si le flag m est présent) ($) :
Code :
if(preg_match_all("#^index\.php\?lg=([a-z]{2})$#Ui", ...
Mais dans ce cas là, la fonction preg_match suffira.


En espérant avoir bien saisi votre problème, Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2006, 23h32   #3
Invité de passage
 
Inscription : août 2004
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 4
Points : 1
Points : 1
Ah merci !

j'ai pas pensé à utiliser ^ $...

voilà ma fonction a quoi elle ressemblera en gros au final :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function rewriteURL($url) {
 
	$extension=".html";
 
	switch(TRUE) {
		case (preg_match_all("#^index\.php\?lg=(\w*)$#Ui", $url, $matche, PREG_PATTERN_ORDER)) :
			$format="%s/";
			return sprintf($format, $matche[1][0]).$extension;
			break;
		case (preg_match_all("#^index\.php\?lg=(\w*)&rub=(\w*)$#Ui", $url, $matche, PREG_PATTERN_ORDER)) :
			$format="%s/test-%s";
			return sprintf($format, $matche[1][0], $matche[2][0]).$extension;
			break;
		case (preg_match_all("#^index\.php\?lg=(\w*)&rub=(\w*)&srub=(\w*)$#Ui", $url, $matche, PREG_PATTERN_ORDER)) :
			$format="%s/rub-%s/srub-%s";
			return sprintf($format, $matche[1][0], $matche[2][0], $matche[3][0]).$extension;
			break;			
		default:
			return $url;
	}
}
Surfoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2006, 14h39   #4
Invité de passage
 
Inscription : août 2004
Messages : 4
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 4
Points : 1
Points : 1
voilà ma fonction :
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
26
27
28
29
 
 function rewriteURL($url) {
 
    $url=delaccent($url);
 
    $extension=".html";
    $separateur="-";
 
    switch(TRUE) {
        case (preg_match_all("#^index\.php\?lg=(\w{2})$#Usi", $url, $matche, PREG_PATTERN_ORDER)) :
            $format="%s";
            $urlrewrite = sprintf($format, $matche[1][0]).$extension;
            break;
 
        case (preg_match_all("#^index\.php\?lg=(\w{2})&rub=([\w-]*)$#Usi", $url, $matche, PREG_PATTERN_ORDER)) :
            $format="%s/test-%s";
            $urlrewrite = sprintf($format, $matche[1][0], $matche[2][0]).$extension;
            break;
 
        case (preg_match_all("#^index\.php\?lg=(\w{2})&rub=([\w-]*)&srub=([\w-]*)$#Usi", $url, $matche, PREG_PATTERN_ORDER)) :
            $format="%s/rub-%s/srub-%s";
            $urlrewrite = sprintf($format, $matche[1][0], $matche[2][0], $matche[3][0]).$extension;
            break;    
        default:
            $urlrewrite = $url;
    }
 
    return $urlrewrite;
}
dans ce cas, je dois faire comme dans le .htaccess : ecrire tous les masques correspondant à mes URL.

Mais pour que ça soit plus simple, je voudrais avoir un tableau qui me retourne le nom de la page, les arguments, et les valeurs des arguments. Donc j'en suis arrivé à ça :

Code :
preg_match_all("#^([\w-\.]+)\?(([\w-]+)=([\w-]*)(&?)+)$#si", $url, $matched, PREG_SET_ORDER);
Le problème c'est que ça ne marche pas vraiment et que je ne connais pas les regex à fond... Alors si quelqu'un à une idée pour résoudre ça, c'est cool.
Surfoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h01.


 
 
 
 
Partenaires

Hébergement Web