[Résolu!!] traitement php de la variable a mettre dans l'url

Nouveau WRInaute
Bonsoir,
J'utilise l'url rewriting pour mon site.
voici ma règle:
RewriteRule ^histoire-([0-9]*)-([-0-9A-Za-z]*)\.php$ /histoire.php?num=$1 [L]

Ainsi je souhaite mettre en première variable l'id d'une histoire, qui servira à la redirection. Je souhaite aussi mettre "pour faire joli" le titre de cette histoire dans l'url (deuxième variable de la règle).

Seulement dans ma page php, comment faut il traiter ma variable $titre pour la transformer en lettres uniquement (avec tirets autorisés)? Pour qu'ainsi je puisse utiliser la variable traitée pour afficher une url correcte? CAD pas de métacaractères, juste du texte minuscule et des tirets...
 
WRInaute accro
Il te faut mettre en place une fonction PHP qui va te générer une url propre à partir de ton titre. Normalement il y a des exemples qui trainent sur le forum, ou sinon tu peux installer un CMS genre SPIP et regarder comment eux font (je n'ai pas ça sous la main présentement).
 
Nouveau WRInaute
Code:
$titrelien = strtolower($donneespres['titre']);
					$titrelien=str_replace(array('ä', 'ê', 'ë', 'ô', 'î', 'ï', 'ô', 'ö', 'û', 'ü', 'ÿ', '€', '#', '+', '*', ' ', '\'', '"', '²', '&', 'é', '~', '"', '{', '(', '[', '|', 'è', '`', 'ç', '^', 'à', 'à', ')', '}', '=', '}', '^', '$', '£', '¤', 'ù', '%', '*', 'µ', ',', '?', ';', ':', '/', '!', '§', '>', '<'), '-', $titrelien);

Est-ce que cette fonction est assez otpimale/sécurisée?
 
WRInaute impliqué
utilise mon urrlName($titre) ... marche nickel. Je ne connais pas la source et ne suis pas l'auteur mais un utilisateur qui à un peu modifié la chose !

Code:
	function enleve_accents ($chaine)
	{
		$reg = '/&(.)(acute|grave|circ|uml|cedil|ring|tilde|slash);/';
		return preg_replace($reg, '\1', htmlentities($chaine));
	}
	
	function suppr_speciaux ($chaine)
	{
		$reg = '|(&[a-zA-Z0-9]*;)|U';
		return preg_replace($reg, '-', $chaine);
	}
	
	function is_utf8 ($string)
	{
		return ! strlen(preg_replace(',[\x09\x0A\x0D\x20-\x7E]' . # ASCII
	'|[\xC2-\xDF][\x80-\xBF]' . # non-overlong 2-byte
	'|\xE0[\xA0-\xBF][\x80-\xBF]' . # excluding overlongs
	'|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' . # straight 3-byte
	'|\xED[\x80-\x9F][\x80-\xBF]' . # excluding surrogates
	'|\xF0[\x90-\xBF][\x80-\xBF]{2}' . # planes 1-3
	'|[\xF1-\xF3][\x80-\xBF]{3}' . # planes 4-15
	'|\xF4[\x80-\x8F][\x80-\xBF]{2}' . # plane 16
	',sS', '', $string));
	}
	
	function urlName ($texte)
	{
		if (is_utf8($texte))
			$texte = utf8_decode($texte);
		$texte = strtolower(suppr_speciaux(enleve_accents($texte)));
		$texte = preg_replace("/(l'|d'|t'| et | st | de | un | le | de | du | lui | mon | ton | les | son | sa | ca | je | tu | il | elle | nous | vous | ils | elles | la | ce | de | son | dont | qui | a | une | ne | des | en |t-|-t)/", " ", $texte);
		$reg = '|([^a-z0-9]+)|';
		$texte = preg_replace($reg, '-', $texte);
		return trim($texte, '-');
	}

Tu remarqueras que tu peux enlever des mots parasites dans la function urlName ... si tu veux !
 
WRInaute impliqué
Cannibal Kro a dit:
Code:
$titrelien = strtolower($donneespres['titre']);
					$titrelien=str_replace(array('ä', 'ê', 'ë', 'ô', 'î', 'ï', 'ô', 'ö', 'û', 'ü', 'ÿ', '€', '#', '+', '*', ' ', '\'', '"', '²', '&', 'é', '~', '"', '{', '(', '[', '|', 'è', '`', 'ç', '^', 'à', 'à', ')', '}', '=', '}', '^', '$', '£', '¤', 'ù', '%', '*', 'µ', ',', '?', ';', ':', '/', '!', '§', '>', '<'), '-', $titrelien);

Est-ce que cette fonction est assez otpimale/sécurisée?

Ca devrait plus ou moins marcher, jusqu'au jouroù quelqu'un te mettra des lettres majuscules accentuées (quoi que ça en théorie tu le gère) ou d'autres caractères ... regarde ma solution elle marche a 100%

EDIT : en plus je sais pas ce que fait ta fonction à toi, mais j'ai des doutes sur le résultat en sortie ;)
Compare avec un texte pris au hazard sur un site et tu verras celui que tu veux
 
Nouveau WRInaute
Okay merci je pense prendre ta solution car comme tu dis ça revient assez souvent sur les plateformes sociales les caractères genre les coeurs, signes chinois etc...
 
Discussions similaires
Haut