Problème avec str_replace

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Salut à tous,

J'ai un léger problème dans une fonction phptemplate. Le but de cette fonction et d'assigner au chaque élément de menu un ID CSS.

Pour cela,la fonction transforme la chaine de caractère en échangeant les espaces par des tirets bas, et les majuscules par les minuscules.

Voilà en exemple :

$search    = array("á", "â", "ä", "a", "a", "a",
                  "é", "e", "ë", "e", "e",
                 "ó", "ô", "ö", "o", "o",
                 "í", "î", "i", "i",
                    "ú", "u", "ü", "u",
                    "ý", "y",
                  "ç",
                 "Á", "Â", "Ä", "A", "A", "A",
                  "É", "E", "Ë", "E", "E",
                 "Ó", "Ô", "Ö", "O", "O",
                 "Í", "Î", "I", "I",
                    "Ú", "U", "Ü", "U",
                    "Ý", "Y",
                  "Ç",
                 "'", '"', "`", " ");
                
$replace    = array("a", "a", "a", "a", "a", "a",
                    "e", "e", "e", "e", "e",
                 "o", "o", "o", "o", "o",
                 "i", "i", "i", "i",
                    "u", "u", "u", "u",
                    "y", "y",
                  "c",
                 "A", "A", "A", "A", "A", "A",
                  "E", "E", "E", "E", "E",
                 "O", "O", "O", "O", "O",
                 "I", "I", "I", "I",
                    "U", "U", "U", "U",
                    "Y", "Y",
                  "C",
                 "-", "-", "-", "_"
                 );
 
 
 
  $css_id = strtolower(str_replace($search, $replace, strip_tags($link)));
 
  return '<li id="' . $css_id . '" class="' . ($leaf ? 'leaf' : ($children ? 'expanded' : 'collapsed')) .'">'. $link . $children ."</li>\n";
}

Le problème avec cette fonction, c'est qu'elle ne transforme pas les caractères spéciaux, comme le "é", j'ai pourtant essayé en local dans un fihcier PHP et ça a marché, mais sous Drupal, sans succès.

La fonction transforme bel et bien l'espace en tiret bas, mais le "é", n'est pas transformé en "e".

Quelqu'un pourrait m'aider sur ce point ?

Merci

Version de Drupal : 

C'est quelle fonction que tu redéfinie sur ton phptemplate ?
Au vu du return, ca semble être une fonction qui met en forme un élément pour une sortie html ?

A partir de là, tu es sur que le texte soumis comporte bien les caractères accentué et non les "équivalents" html ? (c'est a dire les &egrave ; &eacute ; et autres &ccedil ; (sans les espaces, bien sur, sinon ils sont interpréter ici))
Si c'est le cas, c'est plutot logique que la substitution n'est pas effectué (mais que les espaces, eux, fonctionnent).

Sinon, pour info, j'ai du faire la même chose pour divers petit module, et pour le faire, je suis parti de la technique employé dans pathauto. Au final, ca donne ça :

<?php
 
// transileration
 
$titre_du_noeud = <em>transliteration($titre_du_noeud);

  // Definition d'un pattern de remplacement
  // Tout ce qui n'est pas alphanumérique pur (A à Z, sans accent, 0 à 9)
  // devient un $separator

  $pattern = "/[^a-zA-Z0-9]+/ ";
 
$separator = "</em>";
 
$node_clean = preg_replace($pattern, $separator, $titre_du_noeud);

/**
 * _transliteration
 * @param
 *  $chaine : chaine de caractere. La chaine dans laquelle il faut virer
 *            tous les méchants caracteres pas beaux
 * @return
 *  $o : la chaine d'entrée avec les caractere pas beaux remplacés par
des caracteres beaux
 */
function _transliteration($chaine) {
 
// Transliteration Powwwaaaa !!!!
 
$path = drupal_get_path('module', 'Mon_Petit_Module');
  if (
is_file($path. '/i18n-ascii.txt')) {
   
$translations = parse_ini_file($path. '/i18n-ascii.txt');
  }
 
$o = strtr($chaine, $translations);
  return
$o;
}

?>

(voir fichier attaché pour le i18n-ascii.txt qui est dans le code)

Au cas où ça pourrait te servir ;)

La fonction définie dans phptemplate se charge d'attribuer aux liens dans le menu de navigation un ID Css unique afin de personnaliser chaque élément de menu, j'utilise cette fonction pour placer une icône différente pour chaque lien.

Et dans le CSS, je dois définir cette icone de cette manière :

#left li#classes_documentaires a {
background:url(icons/classes_documentaires.jpg);
}

La fonction a donc attribué au lien "Classes Documentaires" dans le menu navigation, un ID Css (classes_documentaires), en transformant les majuscules en minuscules, et les espaces en tirets bas.

Comme je l'ai expliqué plus haut, il ne transforme pas les caractères spéciaux, par exemple, pour le lien "Espace détente", logiquement, je devrais mettre dans le CSS :

#left li#espace_detente a {
background:url(icons/classes_documentaires.jpg);
}

Mais cela ne donne rien, l'icône ne s'affiche pas.

Voilà tout

Exacte oui !

Dans le fichier CSS attaché, la classe est du genre #left li#espace_detente a {..

Mais quand je vais voir le code source de la page sous firefox, je trouve : #left li#espace_détente a {..

donc le "é" est interprété tel qu'il est.

Sauf qu'en CSS, le "é", n'existe pas !