Page 1 sur 1

Comportement inexpliqué de preg_replace

Posté : 23 mars 2011, 13:37
par Stef
Hi everyone!

J'ai un code tout simple qui est censé me permettre de remplacer les caractères accentués d'une chaine:
$newcat = preg_replace('#[\s]{1,}#', '_', $newcat);
		
$search = array ('#[éèêë]#i', '#[àâ]#i', '#[îï]#i', '#[ûùü]#i', '#[ôö]#i', '#[ç]#i', '#[^a-zA-Z0-9\-_]#');
$replace = array ('e', 'a', 'i', 'u', 'o', 'c', '');
		
$newcat = preg_replace($search, $replace, $newcat);
Si j'utilise ce code par exemple avec la chaine suivante: é î ü à ô

J'obtiens: ee_ei_eu_ea_eo

Pourquoi ça me rajoute un e devant chaque caractère?

Merci beaucoup pour votre aide!! :)

Re: Comportement inexpliqué de preg_replace

Posté : 23 mars 2011, 18:44
par AB
Et pourquoi tu utilises pas simplement str_replace avec un tableau cible et un tableau de remplacement ?

Re: Comportement inexpliqué de preg_replace

Posté : 23 mars 2011, 21:04
par Stef
Hi AB, merci pour ta réponse! :)

En me balladant de forums en forums à la recherche d'une solution, je suis tombé sur une solution que j'ai adaptée à mon besoin, et que voici:
function cleanName($str) {
			
	$str = preg_replace('#[\s]{1,}#', '_', $str);
			
	$translit = array('Á'=>'A','À'=>'A','Â'=>'A','Ä'=>'A','Ã'=>'A','Å'=>'A','Ç'=>'C','É'=>'E','È'=>'E','Ê'=>'E','Ë'=>'E','Í'=>'I','Ï'=>'I','Î'=>'I','Ì'=>'I','Ñ'=>'N','Ó'=>'O','Ò'=>'O','Ô'=>'O','Ö'=>'O','Õ'=>'O','Ú'=>'U','Ù'=>'U','Û'=>'U','Ü'=>'U','Ý'=>'Y','á'=>'a','à'=>'a','â'=>'a','ä'=>'a','ã'=>'a','å'=>'a','ç'=>'c','é'=>'e','è'=>'e','ê'=>'e','ë'=>'e','í'=>'i','ì'=>'i','î'=>'i','ï'=>'i','ñ'=>'n','ó'=>'o','ò'=>'o','ô'=>'o','ö'=>'o','õ'=>'o','ú'=>'u','ù'=>'u','û'=>'u','ü'=>'u','ý'=>'y','ÿ'=>'y');
			
	$str = strtr($str, $translit);
			
	$str = preg_replace('#[^a-zA-Z0-9\-_]#', '_', $str);
			
	return $str;
			
}
La solution avec str_replace, j'y ai pensé mais je n'ai pas essayé...

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 00:47
par AB
A quoi sert
$str = preg_replace('#[\s]{1,}#', '_', $str);
...étant donné que plus loin tu fais
$str = preg_replace('#[^a-zA-Z0-9\-_]#', '_', $str);
Sinon utilises plutôt str_replace plutôt que strtr car strtr n'est pas compatible utf-8

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 01:29
par Stef
A quoi sert
$str = preg_replace('#[\s]{1,}#', '_', $str);
...étant donné que plus loin tu fais
$str = preg_replace('#[^a-zA-Z0-9\-_]#', '_', $str);
A remplacer par un seul underscore un ou plusieurs espaces consécutifs, plutôt que de remplacer chaque espace par un underscore...

Sinon utilises plutôt str_replace plutôt que strtr car strtr n'est pas compatible utf-8
Oui c'est bien ce que j'ai vu à propos de strtr en cherchant sur le web. Mais figure-toi qu'avec la méthode que j'emploie j'obtiens le résultat voulu...

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 04:26
par AB
A quoi sert
$str = preg_replace('#[\s]{1,}#', '_', $str);
...étant donné que plus loin tu fais
$str = preg_replace('#[^a-zA-Z0-9\-_]#', '_', $str);
A remplacer par un seul underscore un ou plusieurs espaces consécutifs, plutôt que de remplacer chaque espace par un underscore...

Sinon utilises plutôt str_replace plutôt que strtr car strtr n'est pas compatible utf-8
Oui c'est bien ce que j'ai vu à propos de strtr en cherchant sur le web. Mais figure-toi qu'avec la méthode que j'emploie j'obtiens le résultat voulu...
1/ Ah ok, j'utilise ce genre de remplacement pour renommer des fichiers donc je n'ai pas ce genre de besoin.

2/ Pour "strtr" si ça fonctionne c'est sans doute que tu n'utilise pas l'utf-8... Pour ma part j'ai complètement oublié cette fonction puisque str_replace fonctionne dans tous les cas (...pourquoi s'embêter avec une fonction qui peut potentiellement poser des problèmes).

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 06:18
par Stef
Si si, je suis en utf-8!

Code : Tout sélectionner

$ file -i /var/www/html/work/test.php /var/www/html/work/test.php: text/x-php; charset=utf-8
Comment tu t'y prendrais avec str_replace et des tableaux? un p'tit exemple....

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 18:29
par AB
On peut utiliser des tableaux comme paramètre de str_replace :
$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', 'oe',
            '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);

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 18:43
par stealth35
il fallait rajouter l'option u
$newcat = 'é î ü à ô';
$newcat = preg_replace('#[\s]{1,}#u', '_', $newcat);
               
$search = array ('#[éèêë]#iu', '#[àâ]#iu', '#[îï]#iu', '#[ûùü]#iu', '#[ôö]#iu', '#[ç]#iu', '#[^a-zA-Z0-9\-_]#');
$replace = array ('e', 'a', 'i', 'u', 'o', 'c', '');
               
$newcat = preg_replace($search, $replace, $newcat);

var_dump($newcat);

Re: Comportement inexpliqué de preg_replace

Posté : 24 mars 2011, 18:48
par Stef
Super! Merci à vous les gaziers!! :)

Je vais essayer ce que vous m'avez proposé tous deux.

Edit, du coup je vais me renseigner au passage sur les options (je ne connaissais que i); j'ai trouvé cette page (je connaissais déjà ce site d'ailleurs dont j'avais trouvé le lien sur ce forum):

http://www.expreg.com/options.php