Nettoyage d'une URl

Eléphant du PHP | 398 Messages

25 févr. 2009, 12:28

Salutations amis phpistes ^^.

Je développe une méthode pour transformer une chaine de caractères en url de type ma-chaine-de-caractere-transforme.html.
Par contre, il m arrive d avoir un - ou -- en fin de chaine (juste avant le .html) et j ai quelque soucis à l enlever.
EDIT : En modifiant la methode, j ai presque resolu mon soucis. Mais il reste un - en cas de recursivité

Methode :
class test{

/** autre methodes **/
	function _creationURL($intQuest){
		
		//Mise en minuscule de l intitule de la question
		$urlQuest = strtolower($intQuest);
		//Remplacement des caracteres speciaux
		$urlQuest = strtr($urlQuest, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäå@çèéêëìíîïðòóôõöùúûüýÿ+!?', 'aaaaaaceeeeiiiiooooouuuuyaaaaaaaceeeeiiiioooooouuuuyy---');
		//Enlevement des espaces, des " et ' remplacés par des -
		$urlQuest = str_replace(" ","-",$urlQuest);
		$urlQuest = str_replace('"','',$urlQuest);
		//En cas de ---
		$urlQuest = str_replace("---","-",$urlQuest);
		
		//Si le dernier caractere de la chaine est un -, on l enleve
		echo '<br />la chaine avant enlevement du dernier caractere : '.$urlQuest.'| Fin<br />';
		if(substr($urlQuest,strlen($urlQuest)-1,strlen($urlQuest)) == "-"){
			$urlQuest = substr($urlQuest,0,strlen($urlQuest)-1);
			self::_creationURL($urlQuest); //Recursivité tant que la fin de l url a un -
			$urlQuest = $urlQuest.'.html';
		}else{
		//rajout de .html à la fin
			$urlQuest = $urlQuest.'.html';
		}
		echo '<br />URL finale : '.$urlQuest;
		return $urlQuest;
	}

}
$otest = new test();
$q = 'Pourquoi A fE D a ?';
echo 'Question : '.$q.'<br /><br />';
$otest->_creationURL($q);
et ça affiche :
Question : Pourquoi A fE D a ?

la chaine avant enlevement du dernier caractere : pourquoi-a-fe-d-a--| Fin

la chaine avant enlevement du dernier caractere : pourquoi-a-fe-d-a-| Fin

la chaine avant enlevement du dernier caractere : pourquoi-a-fe-d-a| Fin

URL finale : pourquoi-a-fe-d-a.html
URL finale : pourquoi-a-fe-d-a.html
URL finale : pourquoi-a-fe-d-a-.html
Je sais que c est un ptit truc à la con mais je le trouve pas ^^. Merci d avance

EDIT :
Au final j ai reussi :).

	static function _creationURL($intQuest){
		
		//Mise en minuscule de l intitule de la question
		$urlQuest = strtolower($intQuest);
		//Remplacement des caracteres speciaux
		$urlQuest = strtr($urlQuest, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäå@çèéêëìíîïðòóôõöùúûüýÿ+!?', 'aaaaaaceeeeiiiiooooouuuuyaaaaaaaceeeeiiiioooooouuuuyy---');
		//Enlevement des espaces, des " et ' remplacés par des -
		$urlQuest = str_replace(" ","-",$urlQuest);
		$urlQuest = str_replace('"','',$urlQuest);
		//En cas de ---
		$urlQuest = str_replace("---","-",$urlQuest);
		
		//Si le dernier caractere de la chaine est un -, on l enleve
		//echo '<br />la chaine avant enlevement du dernier caractere : '.$urlQuest.'| Fin<br />';
		while(substr($urlQuest,strlen($urlQuest)-1,strlen($urlQuest)) == "-"){
			$urlQuest = substr($urlQuest,0,strlen($urlQuest)-1);
			self::_creationURL($urlQuest); //Recursivité tant que la fin de l url a un -
		}
		return $urlQuest.'.html';
	}//fin methode
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

ViPHP
ViPHP | 1996 Messages

25 févr. 2009, 15:59

Bonjour BaLiSTiK,

Que penses tu de cette optimisation ?
static function _creationURL($intQuest){
        
        //Mise en minuscule de l intitule de la question
        $urlQuest = strtolower($intQuest);
        //Remplacement des caracteres speciaux
        $urlQuest = strtr($urlQuest, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäå@çèéêëìíîïðòóôõöùúûüýÿ+!?', 'aaaaaaceeeeiiiiooooouuuuyaaaaaaaceeeeiiiioooooouuuuyy---');



       //ICI
        //Enlevement des espaces, des " et ' remplacés par des -
        $table_un = array (" ",'"',"---");
        $table_remplacement = array ("-",'',"-");
        $urlQuest = str_replace($table_un,$table_remplacement,$urlQuest);

        
        //ET ICI
        //Si le dernier caractere de la chaine est un -, on l enleve
        //echo '<br />la chaine avant enlevement du dernier caractere : '.$urlQuest.'| Fin<br />';
        while(strrpos ($urlQuest,"-") == strlen($urlQuest)){
            $urlQuest = substr($urlQuest,0,-1);
            self::_creationURL($urlQuest); //Recursivité tant que la fin de l url a un -
        }
        return $urlQuest.'.html';
    }//fin methode 
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 398 Messages

09 mars 2009, 12:13

J ai appliqué ton tableau de remplacement mais il y a un point sur lequel j ai de nouveau un soucis, c est en cas de double tiret ou plus.
J ai pensé à faire une regexp qui en cas de double tiret remplace par un simple, en utilisant preg_replace mais ça n a pas l air de fonctionner (je suis une quiche en regexp ^^)
		$pattern = '/^([-]*)$/'; //en cas de -*
		while(preg_match($pattern,$urlQuest)){
			$urlQuest = preg_replace($pattern,'-',$urlQuest);
			self::_creationURL($urlQuest);
		}
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 170 Messages

09 mars 2009, 13:39

Bonjour,

une autre solution :
<?php
$urlQuest = ' Pourquoi çA fE  2 D a ? ';

$urlQuest = strtolower($urlQuest);
$urlQuest = strtr($urlQuest, 'àáâãäå@çèéêëìíîïðòóôõöùúûüýÿ', 'aaaaaaaceeeeiiiioooooouuuuyy');
$urlQuest = preg_replace('/\W+/', '-', $urlQuest);
$urlQuest = trim($urlQuest, '-').'.html';

echo $urlQuest;
?>

Eléphant du PHP | 398 Messages

09 mars 2009, 13:41

C est vrai que je n avais aps pensé au trim() pour enlever les espaces à la fin, mais il restera quand même un bla-bla-.html : d'ou ma boucle while et la recursivité .
Mais pour la regexp, le W+ correspond à quoi stp :) ?
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 170 Messages

09 mars 2009, 13:48

C est vrai que je n avais aps pensé au trim() pour enlever les espaces à la fin, mais il restera quand même un bla-bla-.html
Non.
As-tu essayé ?
( Voir le manuel )
Mais pour la regexp, le W+ correspond à quoi stp ?
\W représente tout caractère qui n'est pas un caractère de "mot"
( Voir le manuel )

Eléphant du PHP | 398 Messages

09 mars 2009, 13:54

$var = ' balblala - ';
echo trim($var); 
affiche : balblala -

Je vais tenter avec le W+, je dirai si ça fonctionne :).
Thx
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 170 Messages

09 mars 2009, 14:04

$var = ' balblala - ';
echo trim($var); 
affiche : balblala -
Je n'ai jamais écrit un tel code.

Je te propose de relire mon code et surtout de le tester.

Je ne demande pas ce que tu crois que ça pourrait éventuellement donner.
Je te demande ce que tu vois à l'écran.

Est-ce qu'il y a un "-" à la fin ?

Eléphant du PHP | 398 Messages

09 mars 2009, 15:03

C était à titre d exemple pour illustrer le fait que si une chaine de caractère se finit par un simple tiret, en y appliquant un trim() celà ne changeait rien. trim enlève uniquement les espaces en début et fin de chaines, d ou ma boucle while :). On a du mal se comprendre ^^.
Pour l instant cette solution fonctionne donc je n'y touches pas, (voir ptete y revenir apres) mais ce qui m'importe c est effacer tout ce qui est double tiret ou plus.
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

ViPHP
ViPHP | 3607 Messages

09 mars 2009, 15:45

trim enlève uniquement les espaces en début et fin de chaines,.
Hum hum... faut!
http://fr.php.net/manual/fr/function.trim.php
Quel est le deuxième argumetn de trim?

Eléphant du PHP | 398 Messages

09 mars 2009, 15:53

Au temps pour moi ^^. Dans le cas ou je me retrouve avec un -- en fin de chaine, dans ce cas là, mieux vaut-il aps placer le trim($var,'-'); dans le while ?
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe

Eléphant du PHP | 170 Messages

09 mars 2009, 20:27

BaLiSTiK, je vois que tu n'aimes pas ma solution :(
Je retente quand même ...

Tu n'as pas besoin de boucle while :
( j'ai fait afficher les différentes étapes )
<?php

$intQuest = " BaLiSTiK -> Tu n'as PÔ besoin de boucle while !!!  ----------------------";
echo $intQuest,'<br>';

$urlQuest = strtolower($intQuest);
echo $urlQuest,'<br>';

$urlQuest = strtr($urlQuest, 'àáâãäå@çèéêëìíîïðòóôõöùúûüýÿ', 'aaaaaaaceeeeiiiioooooouuuuyy');
echo $urlQuest,'<br>';

$urlQuest = preg_replace('/\W+/', '-', $urlQuest);
echo $urlQuest,'<br>';

$urlQuest = trim($urlQuest, '-');
echo $urlQuest,'<br>';

$urlQuest = $urlQuest . '.html';
echo $urlQuest,'<br>';

?>

Eléphant du PHP | 170 Messages

09 mars 2009, 20:42

Dans le cas ou je me retrouve avec un -- en fin de chaine, dans ce cas là, mieux vaut-il aps placer le trim($var,'-'); dans le while ?
Il faut essayer ... ( ça mord pas ) :wink:
<?php

$chaine = '-------blabla-----------------------------------------------------------';

echo trim($chaine, '-');

?>

Eléphant du PHP | 398 Messages

13 mars 2009, 10:28

j ai appliqué le trim avec le tiret en parametre, ça à l air OK
Merci bien.

Je redeterrerrai le topic au cas ou ^^
----------------------------------------------------------------------------------
https://astro-otter.space - Discover wonders and mysteries of Universe