8791 sujets

Développement web côté serveur, CMS

Rebonsoir à tous,

J'ai mis au point une fonction pour traiter le titre d'une news afin de l'ajouter dans l'URL de la news, c'est pour optimiser l'url rewriting.

Je suis en UTF-8, c'est pour cela que j'utilise un mb_strtolower.

Le problème est que j'obtiens ce résultat là une fois ma fonction exécutée :

$titretiret = conf[?]urence-de-presse-[?]a-l-e3
[?] = les petits losange avec un point d'interrogation dedans

A l'origine la variable $titre est :

$titre = Conférence de presse à l'E3

Et je voudrais obtenir ceci :

$titretiret = conference-de-presse-a-l-e3

D'où vient le problème ? Merci Smiley cligne

function  stripspaces($titre) 
{
	$titresanschars = strtr(mb_strtolower($titre), "àáâãäåòóôõöøèéêëçÌÍÎÏìíîïùúûüÿñ²","aaaaaaooooooeeeeciiiiiiiiuuuuyn2");
	$titretiret = str_replace(" ","-", $titresanschars);
	$titretiret = str_replace("'","-", $titretiret);
	$titretiret = preg_replace('`-{2,}`', '-', $titretiret);
	if (preg_match("#-$#", $titretiret))
	{
		$titretiret = rtrim($titretiret, "-");
	}
	return $titretiret;
}

Modifié par Ben5back (01 Jul 2009 - 10:47)
Ben5back a écrit :
Je suis en UTF-8, c'est pour cela que j'utilise un mb_strtolower.

Hum ?
Il n'y a pas vraiment de corrélation entre le début et la fin de ta phrase.
Ah bon ? C'est pourtant ce que j'ai lu. Lorsqu'on est en utf-8 il faut utiliser les fonctions multi-octets.

C'est faux ?

EDIT : J'ai mis strtolower au lieu de mb_strtolower et c'est vrai qu'il n'y a aucune différence...
Modifié par Ben5back (01 Jul 2009 - 10:02)
C'est juste une histoire de locale (cf setlocale()) pour que les fonctions sur les chaines, comme par exemple strotlower(), convertissent très bien les caractères accentués.
Ok merci.

J'ai encore un petit souci. Sur ma page d'accueil, j'affiche la dernière news tronquée et le titre des 2 précédentes. Problème ! Ma fonction d'optimisation d'URL fonctionne très bien pour le titre de la première news, mais pour les deux suivantes, c'est comme si certains preg_replace était ignoré. Pourquoi cela ?

D'ailleurs j'imagine que je peux optimiser cette fonction, regrouper certaines choses ensemble, si vous pouvez me mettre sur la voie, ça serait cool !

Merci Smiley cligne

fonctions.php :

<?php
function traite_url($titre, $charset='utf-8') 
{
	$titre = htmlentities($titre, ENT_NOQUOTES, $charset);
	
	$titresanschars = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $titre);
    $titresanschars = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $titresanschars); // pour les ligatures e.g. '&oelig;'
    $titresanschars = preg_replace('#\&[^;]+\;#', '', $titresanschars); // supprime les autres caractères
	$titresanschars = preg_replace('#\?\!#', '', $titresanschars); // supprime les ? et !
	
	$titresanschars = strtolower($titresanschars);
	$titretiret = str_replace(" ","-", $titresanschars);
	$titretiret = str_replace("'","-", $titretiret);
	$titretiret = preg_replace('`-{2,}`', '-', $titretiret);
	if (preg_match("#-$#", $titretiret))
	{
		$titretiret = rtrim($titretiret, "-");
	}
	return $titretiret;
}
?>


accueil.php :

<?php
		$retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 1');
		while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news
		{
			$contenu = stripslashes($donnees['contenu']);
			$contenu = substr($contenu, 0,220);
			
			$titre = stripslashes(htmlspecialchars($donnees['titre']));
			$titretiret = traite_url($titre);
			
			echo '<a href="news-'.$donnees['id'].'-' .$titretiret. '.html"><img src="upload/image/news/thumbnails/'.$donnees['image'].'" align="left" class="image" /></a><h2 align="left"><a href="news-'.$donnees['id'].'-' .$titretiret. '.html">' .$titre. '</a> | ' .date('d/m/y', $donnees['timestamp']). '</h2>
			<p>' .$contenu. ' <a href="news-'.$donnees['id'].'-' .$titretiret. '.html" title="Lire la suite...">[...]</a></p><br />';
		}
        
        $retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 1, 2');
		while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news
		{
			$titre = stripslashes(htmlspecialchars($donnees['titre']));
			$titretiret = traite_url($titre);
			
			echo '<h3 align="left"><a href="news-'.$donnees['id'].'-' .$titretiret. '.html">' .$titre. '</a> | ' .date('d/m/y', $donnees['timestamp']). '</h3>';
        }
		?>

Modifié par Ben5back (01 Jul 2009 - 10:47)