Url rewriting et tirets

Mammouth du PHP | 574 Messages

17 mai 2019, 17:15

Salut tout le monde.

Bon voilà voilà.

J'ai ma regle ainsi :
RewriteRule ^siteweb-([a-z-]+)-([a-z-]+).html$   siteweb.php?categorie=$1&sous_categorie=$2 [L]
Dans la page le lien est sous cette forme:
<li><a href="siteweb-'.$_GET['categorie'].'-'.simplification($v).'.html">'.ucfirst(strtolower($v)).'</a></li>
Donc le problème provient de $_GET['categorie'] qui par exemple coté bdd correspond à Agence de Voyage.

Du coup les espace deviennent des tirets dans mon url et ce fait ca bug au niveau de l'url_rewriting.

Que faire svp ?

Mammouth du PHP | 652 Messages

17 mai 2019, 17:23

Salut, je dirais, soit tu fais en sorte que les espaces ne soient plus remplacés par des tirets, soit tu changes le séparateur dans ta règle (un / ?).

PS : tu peux faire avec cette expression à condition que seul le dernier groupe puisse contenir des tirets, sinon c'est inextricable avec une seule expression.
^siteweb-([a-z]+)-([a-z-]+).html$


EDIT : quand je dis que les espaces ne soient plus remplacés par des tirets, j'entends qu'ils soient supprimés ou bien remplacés par un autre caractère que le tiret, en adaptant bien entendu l'expression en fonction.
Modifié en dernier par Saian le 17 mai 2019, 17:53, modifié 2 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8112 Messages

17 mai 2019, 17:36

Quand on veut transformer une chaine de caractère (typqiement avec des espaces et des caractères spéciaux) en URL, on crée ce qu'on appelle un "slug"
https://www.google.com/search?q=php+slu ... github.com
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 574 Messages

17 mai 2019, 17:59

je suis désolé mais je ne vois pas comment faire,
Un exemple plus précis est ce possible ?

Mammouth du PHP | 652 Messages

17 mai 2019, 18:05

Et bien tu écris des adresses comme ça par exemple :
siteweb/categorie-1/sous-categorie.html
RewriteRule ^siteweb/([a-z-]+)/([a-z-]+).html$   siteweb.php?categorie=$1&sous_categorie=$2 [L]
Ainsi pas de problème avec les tirets.

Ou alors tu fais des adresses comme ça (pas de tiret dans la catégorie ):
siteweb-categorie1-sous-categorie.html
RewriteRule ^siteweb-([a-z]+)-([a-z-]+).html$   siteweb.php?categorie=$1&sous_categorie=$2 [L]

Si tu peux avoir un nombre variable de tirets dans catégorie et sous catégorie tu ne pourras solutionner le problème avec le seul caractère tiret comme séparateur (à moins de le doubler :P ).

Mammouth du PHP | 574 Messages

17 mai 2019, 18:23

peut etre la premiere solution
Mais j'aimerais comprendre cette histoire de slug ...

Mammouth du PHP | 652 Messages

17 mai 2019, 18:26

Le slug c'est juste le fait de transformer la chaine pour l'utiliser dans une url (c'est peut être un peu réducteur ? ^^). De base on remplace les caractères accentués par leurs caractères non accentués, on met tout en minuscule et on remplace les espaces par des tirets. Mais comme tu disais "Du coup les espaces deviennent des tirets" j'ai pensé que ta chaine était déjà transformée, non ?

Mammouth du PHP | 574 Messages

17 mai 2019, 18:41

Lol bah j'ai fait une fonction pour ca moi lol
// Simplifier une chaine
	function simplification($chaineNonValide, $separator='-') {
		
		$chaineNonValide = strip_tags(html_entity_decode($chaineNonValide));	
		
		$accented = array("-",'&','À','Á','Â','Ã','Ä','Å','Æ','Ă','Ą','Ç','Ć','Č','Œ','Ď','Đ','à','á','â','ã','ä','å','æ','ă','ą','ç','ć','č','œ','ď','đ','È','É','Ê','Ë','Ę','Ě','Ğ','Ì','Í','Î','Ï','İ','Ĺ','Ľ','Ł','è','é','ê','ë','ę','ě','ğ','ì','í','î','ï','ı','ĺ','ľ','ł','Ñ','Ń','Ň','Ò','Ó','Ô','Õ','Ö','Ø','Ő','Ŕ','Ř','Ś','Ş','Š','ñ','ń','ň','ò','ó','ô','ö','ø','ő','ŕ','ř','ś','ş','š','Ţ','Ť','Ù','Ú','Û','Ų','Ü','Ů','Ű','Ý','ß','Ź','Ż','Ž','ţ','ť','ù','ú','û','ų','ü','ů','ű','ý','ÿ','ź','ż','ž','А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я');
		$replace = array("-",'et','A','A','A','A','A','A','AE','A','A','C','C','C','CE','D','D','a','a','a','a','a','a','ae','a','a','c','c','c','ce','d','d','E','E','E','E','E','E','G','I','I','I','I','I','L','L','L','e','e','e','e','e','e','g','i','i','i','i','i','l','l','l','N','N','N','O','O','O','O','O','O','O','R','R','S','S','S','n','n','n','o','o','o','o','o','o','r','r','s','s','s','T','T','U','U','U','U','U','U','U','Y','Y','Z','Z','Z','t','t','u','u','u','u','u','u','u','y','y','z','z','z','A','B','B','r','A','E','E','X','3','N','N','K','N','M','H','O','N','P','a','b','b','r','a','e','e','x','3','n','n','k','n','m','h','o','p','C','T','Y','O','X','U','u','W','W','b','b','b','E','O','R','c','t','y','o','x','u','u','w','w','b','b','b','e','o','r ');
		$chaineValide = str_replace($accented, $replace, $chaineNonValide);
		
		$search = array ('@[ ]@i','@[^a-zA-Z0-9_-]@');
		$replace = array ($separator, '');
		$chaineValide = preg_replace('/(?:(['.$separator.'])\1)\1*/', '$1', trim(strtolower(preg_replace($search, $replace, $chaineValide)), $separator));
		
	return $chaineValide;
				
	}
Donc en gros j'ai pas le choix ?
obligé de mettre des / à la place des - ?

Mammouth du PHP | 652 Messages

17 mai 2019, 19:39

Si le nombre de tirets peut être variable dans la catégorie et dans la sous catégorie tu ne pourras pas écrire une expression régulière pour les extraire en utilisant le tiret comme séparateur (à moins de le doubler).

Après t'es pas obligé de mettre des slashs tu peux mettre autre chose, ou imaginer une autre forme d'url (siteweb-categorie-principale--sous-categorie.html, etc), ou écrire plusieurs règles, une pour chaque catégorie avec la catégorie en dur.

siteweb-categorie-principale--sous-categorie.html
RewriteRule ^siteweb-([a-z-]+)--([a-z-]+).html$   siteweb.php?categorie=$1&sous_categorie=$2 [L]