URL-Rewriting et caractères spéciaux

WRInaute discret
bonjour,

Actuellement j'ai déjà de l'url-rewriting mais pas terrible, en effet je génère des liens avec juste un id (exemple: 456456464.html)

je souhaiterais faire de l'url rewriting avec du texte, mais j'aimerais savoir comment alors ne prendre que les caractères pris en charge dans les urls.

enlever ("'\ /*&$#...), pour les accents je sais comment faire.

Merci de votre aide
 
WRInaute discret
chantra a dit:
un str_replace bien placé :)
str_replace(array('\'','"','#'....),array('','',''...),$mystr)

Certe mais encore faut-il savoir tous les caractères à remplacer ...

Je cherche plutot une méthode qui me garde tous les caractères ascii.

Merci quand meme.
 
WRInaute occasionnel
Salut Domz, voici pour toi une fonction qui pourrait faire l'affaire ;)

Code:
// Le texte à placer dans l'url
$texte = " l'url va être : \"rewritée\" ";

// L'id correspondant à l'enregistrement (afin que chaque url générée soit unique)
$id = 456456464;

// L'extension du fichier généré par l'url-rewriting
$extension = ".html";

// Le caractère utilisé pour séparer les mots dans l'url
$sep_mots = "-";

// Le nombre maximum de caractères dans l'url rewritée (id non-comprise)
$max_caracteres = 50;

/*___________________________________________________________________________________*/

// Appel de la fonction
echo rewriting( $texte, $id, $extension, $sep_mots, $max_caracteres );

// Résultat affiché
// l-url-va-etre-rewritee-456456464.html

/*___________________________________________________________________________________*/


// La fonction en question
function rewriting( $texte, $id, $extension, $sep_mots, $max_caracteres )
{
	// Définition des caractères accentués
	$car_speciaux = array( 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'È', 'É', 'Ê', 'Ë', 'è', 'é', 'ê', 'ë', 'Ì', 'Í', 'Î', 'Ï', 'ì', 'í', 'î', 'ï', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'Ù', 'Ú', 'Û', 'Ü', 'ù', 'ú', 'û', 'ü', 'ß', 'Ç', 'ç', 'Ð', 'ð', 'Ñ', 'ñ', 'Þ', 'þ', 'Ý' );
	// ... et de leurs "équivalents" non-accentués
	$car_normaux  = array( 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'E', 'E', 'E', 'E', 'e', 'e', 'e', 'e', 'I', 'I', 'I', 'I', 'i', 'i', 'i', 'i', 'O', 'O', 'O', 'O', 'O', 'O', 'o', 'o', 'o', 'o', 'o', 'o', 'U', 'U', 'U', 'U', 'u', 'u', 'u', 'u', 'B', 'C', 'c', 'D', 'd', 'N', 'n', 'P', 'p', 'Y' );
	
	// On commence par supprimer les accents
	$texte = str_replace($car_speciaux, $car_normaux, $texte);
	
	// On remplace les caractères non-alphanumériques par le séparateur $sep_mots
	$texte = preg_replace( "/[^A-Za-z0-9]+/", $sep_mots, $texte );
	
	// On supprime le séparateur s'il se trouve en début ou fin de chaîne
	$texte = trim( $texte, $sep_mots );
	
	// On limite la chaine à $max_caracteres caractères (ici 50 caractères)
	$texte = substr( $texte, 0, $max_caracteres );
	
	// On convertit le tout en minuscules
	$texte = strtolower( $texte );
	
	// On ajoute l'id à la fin pour avoir une url unique et on ajoute l'extension (ici .html)
	$texte = "$texte$sep_mots$id$extension";
	
	// On retourne le résultat
	return ( $texte );
};
 
WRInaute passionné
attention avec la fonction de superpj et les entités html, enfin attention aux entités html quand on fais ça, si on gere pas ça foire tout...

de plus superpj, il manque la prise en compte de l'€uro dans ta fonction ;)
 
WRInaute occasionnel
hmmm ... je n'ai pas compris ta remarque sur les entités html :? en quoi genent-elles dans la mesure ou tous les caractères non alphanumériques (donc les </> des tags html) sont supprimés dans la fonction ? ;)

Code:
// On remplace les caractères non-alphanumériques par le séparateur $sep_mots 
$texte = preg_replace( "/[^A-Za-z0-9]+/", $sep_mots, $texte );

EDIT : ok j'ai compris tu voulais dire quand on a $texte qui vaut par exemple "<strong>test</strong>" ne pas se retrouver avec un fichier du genre "strong-test-strong-1.html" :p c'est vrai que je n'avais pas pensé à cela car en général on utilise pour le rewriting un texte extrait d'une base, qui n'a pas encore été mis en forme html. Mais c'est vrai qu'il faut penser à ajouter une fonction pour enlever si nécessaire les tags html :p

Bref mettre ça juste avant la suppression des caractères non-alphan ;) :
Code:
$texte = strip_tags( $texte );
Bien vu jeune codeur talentueux :D
 
WRInaute discret
Merci bcp.

En effet les tags ne sont pas un probleme car à l'enregistrement je fais un strip_tags donc pas d'HTML sur ce champ en base.

Merci à vous.

Sinon j'avais fait ces fonctions :

Code:
function fctConvertToLink($str) {
	$ret = fctRemoveAccents($str);
	$ret = mb_strtolower($str);
	$ret = str_replace(" ","-",$ret);
	$ret = preg_replace("/-+/","-",$ret);
	$ret = preg_replace("/[^a-z0-9'\"-]/i","",$ret);
	$ret = trim($ret,"-");
	return $ret;
}

function fctRemoveAccents($str = '') {
	if(!(is_string($str))) return '';
	$ret = strtr($str, "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ", "AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy");
	return $ret;
}
 
Discussions similaires
Haut