Blog Emmanuel Orchanian

astuce bdd bureautique codage culture débat design énigme français hacking html mathématiques méthodologie santé typographie 

🎓DÉFI CODE PHP Les casses 2/3 écriture en serpent et accolée 🐍

 

 [732 vues] 2022-01-11 Emmanuel Orchanian

Objectif

Dans l'étude précédente nous avions vu l'écriture en kébab, qui-consiste-a-ecrire-les-mots-avec-des-trait-d-union

Je veux à présent faire la même chose avec les écritures suivantes :

  1. L'écriture en serpent voici_l_ecriture_en_serpent
  2. L'écriture en serpent majuscule VOICI_L_ECRITURE_EN_SERPENT_MAJUSCULE
  3. L'écriture accolée voicilecritureaccolee

Objectifs du tutoriel

Ce n'est pas de coder une fonction de A à Z, mais comment recycler intelligemment du code.


    <?php
    function kebab(string $s){
        $s = trim(html_entity_decode($s));//ligne rajoutée à la fin

        // caratères à remplacer par d'autres caratères
        // voyelles
        $s = str_ireplace(mb_str_split('áâàåãä'), 'a',$s);
        $s = str_ireplace(mb_str_split('æ'), 'ae',$s);
        $s = str_ireplace(mb_str_split('éêèë'), 'e',$s);
        $s = str_ireplace(mb_str_split('íîìï'), 'i',$s);
        $s = str_ireplace(mb_str_split('óôòøõö'), 'o',$s);
        $s = str_ireplace(mb_str_split('œ'), 'oe',$s);
        $s = str_ireplace(mb_str_split('ùûüúûùü'), 'u',$s);
        $s = str_ireplace(mb_str_split('ýÿ'), 'y',$s);

        // consonnes
        $s = str_ireplace(mb_str_split('ç¢'), 'c',$s);
        $s = str_ireplace(mb_str_split('Ð'), 'd',$s);
        $s = str_ireplace(mb_str_split('ñ'), 'n',$s);
        $s = str_ireplace(mb_str_split('š'), 's',$s);
        $s = str_ireplace(mb_str_split('€'), 'e',$s);

        // autres
        $s = str_ireplace(mb_str_split('ƒ'), 'f',$s);
        $s = str_ireplace(mb_str_split('ß'), 'ss',$s);
        $s = str_ireplace(mb_str_split('$'), 'dol',$s);
        $s = str_ireplace(mb_str_split('@'), 'at',$s);
        $s = str_ireplace(mb_str_split('²'), '2',$s);
        $s = str_ireplace(mb_str_split('³'), '3',$s);

        // caractères à remplacer par un -
        $s = str_ireplace(mb_str_split('&~"`°=¨£¤%µ,;:§_\''), '-',$s);
        $s = str_ireplace(mb_str_split('^\\|.{}[]()?#!+*'), '-',$s); // regex sauf dollar // (laisser) }
        $s = str_ireplace(mb_str_split(' '), '-',$s);//espace

        // on enleve tous les autres caractères
        // on ne trie plus que les caracteres autorisés en kebab, pour enlever les emoticones qui font plusieurs bytes (certains se mélangent)
        $chara_kebab = '-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
        $arr_chara_kebab = str_split($chara_kebab);
        $s_tmp = '';
        foreach (mb_str_split($s) as $value) if( in_array($value, $arr_chara_kebab))  $s_tmp .= $value ;
        $s = $s_tmp;

        //enlever les - au debut et a la fin
        $s = trim($s,'-');

        // on enlève les tirets en doublon
        while(strpos($s, '--')!==false) $s = str_ireplace('--', '-',$s); // plusieurs tirets

        return $s;
    }

ecriture_en_serpent

Ce qu'il ne faut PAS faire

On pourrait penser de refaire la fonction précédente en faisant un copier-coller (pire, de recopier à la main !) et remplacer les traits d'union du kébab en underscore.

    <?php
    function serpent(string $s){
        $s = trim(html_entity_decode($s));//ligne rajoutée à la fin

        // caratères à remplacer par d'autres caratères
        // voyelles
        $s = str_ireplace(mb_str_split('áâàåãä'), 'a',$s);
        $s = str_ireplace(mb_str_split('æ'), 'ae',$s);
        $s = str_ireplace(mb_str_split('éêèë'), 'e',$s);
        $s = str_ireplace(mb_str_split('íîìï'), 'i',$s);
        $s = str_ireplace(mb_str_split('óôòøõö'), 'o',$s);
        $s = str_ireplace(mb_str_split('œ'), 'oe',$s);
        $s = str_ireplace(mb_str_split('ùûüúûùü'), 'u',$s);
        $s = str_ireplace(mb_str_split('ýÿ'), 'y',$s);

        // consonnes
        $s = str_ireplace(mb_str_split('ç¢'), 'c',$s);
        $s = str_ireplace(mb_str_split('Ð'), 'd',$s);
        $s = str_ireplace(mb_str_split('ñ'), 'n',$s);
        $s = str_ireplace(mb_str_split('š'), 's',$s);
        $s = str_ireplace(mb_str_split('€'), 'e',$s);

        // autres
        $s = str_ireplace(mb_str_split('ƒ'), 'f',$s);
        $s = str_ireplace(mb_str_split('ß'), 'ss',$s);
        $s = str_ireplace(mb_str_split('$'), 'dol',$s);
        $s = str_ireplace(mb_str_split('@'), 'at',$s);
        $s = str_ireplace(mb_str_split('²'), '2',$s);
        $s = str_ireplace(mb_str_split('³'), '3',$s);

        // caractères à remplacer par un _
        $s = str_ireplace(mb_str_split('&~"`°=¨£¤%µ,;:§_\''), '_',$s);
        $s = str_ireplace(mb_str_split('^\\|.{}[]()?#!+*'), '_',$s); // regex sauf dollar // (laisser) }
        $s = str_ireplace(mb_str_split(' '), '_',$s);//espace

        // on enleve tous les autres caractères
        // on ne trie plus que les caracteres autorisés en kebab, pour enlever les emoticones qui font plusieurs bytes (certains se mélangent)
        $chara_kebab = '_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
        $arr_chara_kebab = str_split($chara_kebab);
        $s_tmp = '';
        foreach (mb_str_split($s) as $value) if( in_array($value, $arr_chara_kebab))  $s_tmp .= $value ;
        $s = $s_tmp;

        //enlever les _ au debut et a la fin
        $s = trim($s,'_');

        // on enlève les tirets en doublon
        while(strpos($s, '__')!==false) $s = str_ireplace('__', '_',$s); // plusieurs tirets

        return $s;
    }

C'est complètement inconscient !

Il ne faut pas faire ça !
  1. le risque d'oublier une ligne ou se tromper est trop grand
  2. c'est long à faire
  3. ça a déjà été fait, pas besoin de réinventer la roue...

La bonne manière

Il faut relativiser et se dire qu'écrire en serpent, c'est pareil qu'écrire en kebab mais en remplaçant les traits d'union par des underscore...


    function serpent($s){
        return str_replace('-','_', kebab($s));
    }

En français : "Remplacer les traits d'union par des underscore dans l'écriture en kébab de mon texte.""

Voilà, tout simplement, il faut utiliser une fonction dans une fonction : puis je fais un tout petit changement.

  1. c'est simple
  2. c'est élégant
  3. c'est intuitif lorsqu'on la phrase en français énoncé ci-dessus "écrire en serpent, c'est pareil qu'écrire en kebab mais en remplaçant les traits d'union par des underscore"

ECRITURE_EN_SERPENT_MAJUSCULE

Ce que je ne ferai pas


    function serpent_maj($s){
        return strtoupper(str_replace('-','_', kebab($s)));
    }

Ici, certains feraient un copié-collé de la fonction serpent en y rajoutant strtoupper qui indique "met en majuscules".

Alors ça fonctionne, mais je lui préfèrerait :


    function serpent_maj($s){
        return strtoupper(serpent($s));
    }

Qui signifie de manière simple "met en majuscule l'écriture en serpent" qui selon-moi colle plus que "met en majuscule le remplacement des traits d'union par des underscore dans l'écriture en kébab de mon texte."

Donc j'utilise simplement un fonction qui appelle une autre fonction, peu importe si serpent appelle à son tour une autre (encore) fonction, tant que mon code est compréhensible, simple...

Je peux me permettre de faire des chaînages de fonction (une fonction qui en apelle une autre qui en apelle une autre etc.) avec des très petites fonctions de 3 lignes...

ecritureaccolee

En y réfléchissant, c'est du kébab sans les traits d'union


    function accolee($s){
        return strtoupper(str_replace('-','', kebab($s)));
    }

Ici j'ai fait un copié-collé de la fonction "serpent", et quand je remplace quelque chose par un texte vide, cela équivaut à effacer cette chose.


Autres défis

Jusqu'à ce que je sort les prochains articles, je vous met au défi de faire le code de l'écriture en camel et en pascal :

  • Écriture en camel : bonjourMonsieurDurand
  • Écriture en pascal : BonjourMonsieurDurand

Avez-vous perçu la différence ? Seriez-vous capable de coder ça ?

Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.