[1193 vues] 2022-01-11 Emmanuel Orchanian
NOTE : cet article a été affiché dans sa langue originale.
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 :
- L'écriture en serpent
voici_l_ecriture_en_serpent
- L'écriture en serpent majuscule
VOICI_L_ECRITURE_EN_SERPENT_MAJUSCULE
- 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 functionserpent (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 !- le risque d'oublier une ligne ou se tromper est trop grand
- c'est long à faire
- ç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.
- c'est simple
- c'est élégant
- 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.