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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : réécriture d'url preg_replace() ou str_replace() ?

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

par AB » 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 !

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

par stealth35 » 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);

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

par ReKoNe » 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; }

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

par ReKoNe » 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 :)

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

par enneite » 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 ...

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

par AB » 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()

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

par enneite » 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;
}