[PHP] Remplacer des caractères dans une chaine

Bonjour,

Ayant seulement 2-3 sites php à mon actif, je bute sur un problème qui, je pense, n’est pas très complexe…
J’ai une page qui permet de saisir des entrées (article de presse) sur ma DB, et qui upload des fichiers sur le serveur.
Je renomme ces fichiers de la manière suivante : date_titre.extension
J’arrive à remplacer les espaces par des “_” mais je bloque sur les accents et autres caractères spéciaux.
Voici ce que j’ai essayé de faire (et qui ne fonctionne pas !) :

$carac = array("à", "â", "ä", "é", "è", "ê", "ë", "î", "ï", "ô", "ö", "û", "ù", "ü", "'", " ");
$newtitre=str_replace($carac, "_", $titre);

Existe t il une fonction permettant de repérer ces caractères spéciaux puis de les remplacer ?

Merci d’avance !

Habituellement on utilise la fonction strtr :

http://www.php.net/manual/fr/function.strtr.php

Fait une recherche sur google avec ça, y a un bout de code tout fait avec la plupart des accents remplacés par les équivalents sans accents :slight_smile:

Merci pour ta réponse, mais j’ai recherché, et ca semble étre plus ou moins la même chose que mon str_replace…
J’ai testé quand même, mais c’est pas plus encourageant : aucun caractère remplacé a part l’espace…

Voici mon code (tout plein de tests) :

$newtitre = strtr($titre, "àâäéèêëîïôöûùü", "aaaeeeeiioouuu");
echo $newtitre."<br/>";
$newtitre = strtr($newtitre, " ", "_");
echo $newtitre."<br/>";
$newtitre = strtr($newtitre, "é", "y");
echo $newtitre."<br/>";
$newtitre = strtr($newtitre, "&eacute;", "y");
echo $newtitre."<br/>";

Et voici le résultat de mes echo avec comme exemple ‘le titre énorme’ :

Comme on le voit, le seul changement vient des _

Tu encode tes fichiers en iso? utf?

Et pareil pour le serveur.

function no_accent($str_accent) {
   $pattern = Array("/é/", "/è/", "/ê/", "/ç/", "/à/", "/â/", "/î/", "/ï/", "/ù/", "/ô/");
   // notez bien les / avant et après les caractères
   $rep_pat = Array("e", "e", "e", "c", "a", "a", "i", "i", "u", "o");
   $str_noacc = preg_replace($pattern, $rep_pat, $str_accent);
   return $str_noacc;
}

J’ai trouvé ça sur le premier site retourné par Google
http://www.asp-php.net/ressources/codes/PH…+accentues.aspx

Ca a l’air de correspondre à ce que tu cherches, il suffit que tu rajoutes ta référence à l’espace et à sa conversion dans les variables.

Utiliser des expressions rationnelles (ce qu’utilise preg_replace() pour chercher des caractères précis c’est un peu lourd quand même…

J’avais testé la fonction et ça fait la même chose : seul les espaces sont remplacés :frowning:

function no_accent($titre) {
   $pattern = array("/é/", "/è/", "/ê/", "/ë/", "/ç/", "/à/", "/â/", "/î/", "/ï/", "/ù/", "/ô/", "/ /");
   $rep_pat = array("e", "e", "e", "e", "c", "a", "a", "i", "i", "u", "o", "_");
   $newtitre = preg_replace($pattern, $rep_pat, $titre);
   return $newtitre;
}

$newtitre= no_accent($titre);
echo $newtitre;

J’encode mes fichiers en ISO et le serveur, lorsque je fais un phpinfo() me dit : HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.7
Ca devrait être bon à ce niveau non ? :confused:

Non. Ca veut pas dire qu’il est en iso.

Ca, c’est ce qu’Apache accepte comme encodage ou ton ordi :slight_smile:

Regarde si mb_string est activé, avec les options derrière.

Sinon tu veux jouer avec les regexp :

$titre = preg_replace('/[^a-z0-9A-Z_-]/', '_', $titre);

Mais c’est largement plus bourrin.

Curieux, je viens de la tester, et chez moi elle fonctionne.

Rien de tout ça ne marche, j’ai demandé un coup de main à un pote il me prépare une petite fonction qui convertit en hexa ou chépa trop quoi, j’avoue que j’ai pas tout capté de ce qu’il m’a dit… :heink:
Je pense que ca devrait résoudre mon problème qui semble vraiment lié à l’encodage…

Bon j’ai partiellement résolu mon problème toute seule : en fait le problème venait du fait que le serveur Web est en UTF-8 et la DB en ISO.
Je suis passée par un utf8_encode puis à partir de là j’ai pu enlever les accents de ma chaîne.

J’ai encore un soucis au niveau du ’ (quote).
Par exemple : le titre “c’est un test” va devenir comme nom de fichier sur le serveur => “c\_est_un_test
(sachant que ce titre est également un lien hypertexte pour aller DL le fichier correspondant sur le serveur)

Avec Firefox je n’ai aucun soucis par contre avec IE, le lien est “c”.
Du coup la page est non trouvée…

Si quelqu’un pouvait aider parce que malgré mes recherches google, je n’arrive pas à bien cerner d’où vient le problème (serveur ou code ou ??).
Donc sans pour autant me donner une réponse parfaite, si on pouvait m’aider a comprendre… :neutre:

C’est à cause du slash lu sous IE (car chez MS, le séparateur dans les chemins du FS locale c’est \, et ils se sont dit que foutre ça avec le protocole web ça perdrait pas les utilisateurs…)

Tu as essayé un coup de rawurlencode histoire que le \ soit transformé en un truc genre %35 ?

Non je ne connaissais pas cette fonction, je testerai ca ce soir.

Merci.