réécriture d'url preg_replace() ou str_replace() ?

Eléphant du PHP | 245 Messages

29 sept. 2009, 15:12

J'ai une fonction pour passer des chaines de caractères dans les url,
en gros elle met tout en minuscule, supprime les accents, ensuite elle transforme en underscore, les caractères non alpha numeriques.
J'ai mis en commentaire l'ancienne methode utilisant str_replace() pour une nouvelle méthode avec expressions regulières et preg_replace()

Ma question est :
à priori, laquelle des deux méthodes est la plus rapide et la plus performantes?
faut-il utiliser pluto str_replace() ou preg_replace()dans ce cas ?


function reecriture_pour_url($chaine)
{
	if($chaine=="")return "";

	/*$chaine_modif=$chaine;

	$chaine_modif=strtolower($chaine_modif);
	$chaine_modif=trim($chaine_modif);

	$chaine_modif=str_replace("-","_",$chaine_modif);
	$chaine_modif=str_replace(" ","_",$chaine_modif);

	$chaine_modif=str_replace("à","a",$chaine_modif);
	$chaine_modif=str_replace("â","a",$chaine_modif);
	$chaine_modif=str_replace("ã","a",$chaine_modif);
	$chaine_modif=str_replace("á","a",$chaine_modif);
	$chaine_modif=str_replace("ã","a",$chaine_modif);
	$chaine_modif=str_replace("ä","a",$chaine_modif);
	$chaine_modif=str_replace("å","a",$chaine_modif);
	$chaine_modif=str_replace("æ","a",$chaine_modif);

	$chaine_modif=str_replace("ç","c",$chaine_modif);

	$chaine_modif=str_replace("&","_et_",$chaine_modif);
	$chaine_modif=str_replace("&","_et_",$chaine_modif);

	$chaine_modif=str_replace("é","e",$chaine_modif);
	$chaine_modif=str_replace("é","e",$chaine_modif);
	$chaine_modif=str_replace("©a","e",$chaine_modif);
	$chaine_modif=str_replace("è","e",$chaine_modif);
	$chaine_modif=str_replace("ê","e",$chaine_modif);
	$chaine_modif=str_replace("ë","e",$chaine_modif);

	$chaine_modif=str_replace("î","i",$chaine_modif);
	$chaine_modif=str_replace("ï","i",$chaine_modif);
	$chaine_modif=str_replace("ì","i",$chaine_modif);

	$chaine_modif=str_replace("ñ","n",$chaine_modif);

	$chaine_modif=str_replace("ô","o",$chaine_modif);
	$chaine_modif=str_replace("ö","o",$chaine_modif);
	$chaine_modif=str_replace("œ","o",$chaine_modif);


	$chaine_modif=str_replace("ù","u",$chaine_modif);
	$chaine_modif=str_replace("û","u",$chaine_modif);
	$chaine_modif=str_replace("ü","u",$chaine_modif);

	$chaine_modif=str_replace("***","3_etoiles",$chaine_modif);
	$chaine_modif=str_replace("**","2_etoiles",$chaine_modif);
	$chaine_modif=str_replace("2*","2_etoiles",$chaine_modif);
	$chaine_modif=str_replace("3*","3_etoiles",$chaine_modif);


	$alphabet=array("a","z","e","r","t","y","u","i","o","p","q","s","d","f","g","h","j","k","l","m","w","x","c","v","b","n","1","2","3","4","5","6","7","8","9","0");
	$taille_alphabet=count($alphabet);

	$longueur_chaine=strlen($chaine_modif);

	for ($i=0;$i<$longueur_chaine;$i++)
	{
		$caractere=substr($chaine_modif,$i,1);
		$caractere_ok=false;
		for($j=0;$j<$taille_alphabet;$j++)
		{
			if($caractere==$alphabet[$j]) $caractere_ok=true;
		}
		if($caractere_ok==false) $chaine_modif=str_replace($caractere,"_",$chaine_modif);

	}


	$chaine_modif=str_replace("___","_",$chaine_modif);
	$chaine_modif=str_replace("__","_",$chaine_modif);

	$premier_char=substr($chaine_modif,0,1);

	if($premier_char=="_")
	{	$i=0;

		while(substr($chaine_modif,$i,1)=="_")
		{
			$caractere=substr($chaine_modif,$i,1);
			$caractere="";
			$i++;

		}
	}
	$nb_char=strlen($chaine_modif);
	$premier_char=substr($chaine_modif,0,1);
	if($premier_char=="_")
	{	$i=0;

		while(substr($chaine_modif,$i,1)=="_")
		{
			$chaine_modif=substr($chaine_modif,$i+1,$nb_char);
			$i++;

		}
	}
	$dernier_char=substr($chaine_modif,$nb_char-1,1);

	if($dernier_char=="_") $chaine_modif=substr($chaine_modif,0,$nb_char-1);

	return $chaine_modif;*/

	$sortie=$chaine;
	$sortie=strtolower($sortie);

	$expression='/\&/';
	$sortie = preg_replace($expression,"_et_",$sortie);

	$expression ='/[àáâãäåæ]/';
	$sortie = preg_replace($expression,"a",$sortie);

	$expression ='/ç/';
	$sortie = preg_replace($expression,"c",$sortie);


	$expression ='/[éèêë]/';
	$sortie = preg_replace($expression,"e",$sortie);

	$expression ='/[ìíîï]/';
	$sortie = preg_replace($expression,"i",$sortie);

	$expression ='/ñ/';
	$sortie = preg_replace($expression,"n",$sortie);

	$expression ='/[òðòóôõö]/';
	$sortie = preg_replace($expression,"o",$sortie);

	$expression ='/[ùúûü]/';
	$sortie = preg_replace($expression,"u",$sortie);

	$expression ='/[ýÿ]/';
	$sortie = preg_replace($expression,"y",$sortie);

	$expression ='/\*\*\*|3\*/';
	$sortie = preg_replace($expression,"3_etoiles",$sortie);

	$expression ='/\*\*|2\*/';
	$sortie = preg_replace($expression,"2_etoiles",$sortie);


	$expression='/[^0-9a-zA-Z]/';
	$sortie = preg_replace($expression,"_",$sortie);

	$expression='/___|__/';
	$sortie = preg_replace($expression,"_",$sortie);

	$sortie=trim($sortie,"_");

	return $sortie;
}

ViPHP
AB
ViPHP | 5818 Messages

29 sept. 2009, 16:06

Pour des besoins un peu similaires au tien j'utilise la syntaxe ci-dessous, donc str_replace sous forme de tableau, complété par un petit regex.
Par exemple pour renommer des noms de fichiers (d'où qu'ils viennent) :
	$cible = array(
            'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą',
            'Ç', 'Ć', 'Č', 'Œ',
            'Ď', 'Đ',
            'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą',
            'ç', 'ć', 'č', 'œ',
            'ď', 'đ',
            'È', 'É', 'Ê', 'Ë', 'Ę', 'Ě',
            'Ğ',
            'Ì', 'Í', 'Î', 'Ï', 'İ',
            'Ĺ', 'Ľ', 'Ł',
            'è', 'é', 'ê', 'ë', 'ę', 'ě',
            'ğ',
            'ì', 'í', 'î', 'ï', 'ı',
            'ĺ', 'ľ', 'ł',
            'Ñ', 'Ń', 'Ň',
            'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő',
            'Ŕ', 'Ř',
            'Ś', 'Ş', 'Š',
            'ñ', 'ń', 'ň',
            'ò', 'ó', 'ô', 'ö', 'ø', 'ő',
            'ŕ', 'ř',
            'ś', 'ş', 'š',
            'Ţ', 'Ť',
            'Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű',
            'Ý', 'ß',
            'Ź', 'Ż', 'Ž',
            'ţ', 'ť',
            'ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű',
            'ý', 'ÿ',
            'ź', 'ż', 'ž',
            'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
            'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р',
            'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
            'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
            );
			
	 $rempl = array(
            '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'
            );
		
	$fich = str_replace($cible, $rempl, $fich);
		  
     	$fich = preg_replace('/[^.a-z0-9_]+/i', '-', $fich);
			
	return $fich;
Mais sinon, pour envoyer des caractères accentués ou spéciaux dans les url j'utilise plutôt urlencode() ou rawurlencode() avec à la reception urldecode() ou rawurldecode()

Eléphant du PHP | 245 Messages

29 sept. 2009, 17:19

ouais merci, je vais voir, ce que peut donner les tableaux,
remarque : pour l'urldecode, ca ne m'arrange pas dans la mesure ou je fais cette reecriture pour l'url_rewriting et la génération de site map. donc je veux eviter les %xy ...

ReKoNe
Invité n'ayant pas de compte PHPfrance

22 avr. 2010, 14:38

Personnellement j'utilise ceci :

function botanic_rewrite_value_for_axapta ($string) {
// Remplacement des caractères spéciaux par des caractères normaux
$from = 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ';
$to = 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy';
$string = strtr($string, $from, $to);
// Suppression des caractères non alpha-numériques et non espaces
$pattern = '/[^0-9a-zA-Z\s]/';
$string = preg_replace($pattern, '', $string);
return $string;
}

Je viens tout juste de l'écrire... c'est à tester mais à priori ça devrait bien marcher :)

ReKoNe
Invité n'ayant pas de compte PHPfrance

22 avr. 2010, 14:40

Désolé pour le doublon... N'étant pas enregistré, je ne peux pas éditer mon message... avec une balise code c'est quand même plus sexy ! ;)

Code : Tout sélectionner

function botanic_rewrite_value_for_axapta ($string) { // Remplacement des caractères spéciaux par des caractères normaux $from = 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ'; $to = 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'; $string = strtr($string, $from, $to); // Suppression des caractères non alpha-numériques et non espaces $pattern = '/[^0-9a-zA-Z\s]/'; $string = preg_replace($pattern, '', $string); return $string; }

ViPHP
ViPHP | 5462 Messages

22 avr. 2010, 14:46

pas besion de s'embete pour les accents (surtout que y'en a encore plein d'autre)
$str = 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ';
$str =  iconv('UTF-8', 'US-ASCII//IGNORE//TRANSLIT', $str);
echo preg_replace('/\W/', '', $str);

ViPHP
AB
ViPHP | 5818 Messages

22 avr. 2010, 16:58

Et attention si vous utilisez des remplacements avec des chaines de caractères listées :

EVITEZ D'UTILISER strtr() car cette fonction n'est pas compatible utf-8.

Comme j'ai fait dans mon exemple plus haut, utilisez str_replace ça coûte pas plus cher et vous n'aurez pas de souci si vous codez en utf-8 !