Il arrive régulièrement en développement que l’on ait à singulariser un mot ou une expression pour rendre cohérente une phrase.
Exemple : “pommes vertes” doit donner “pomme verte”
J’ai alors tenté d’écrire un début de fonction :
function singularize($word) { $phrase = split(" ", $word); $return = ""; $exception_ail = array( 'baux' => 'bail', 'coraux' => 'corail', 'soupiraux' => 'soupirail', 'travaux' => 'travail', 'vantaux' => 'vantail', 'vitraux' => 'vitrail' ); $exception = array( "afin de", "que", "ailleurs", "alors", "après", "au-dessous", "au-dessus", "aujourd’hui", "auparavant", "auprès", "aussi", "aussitôt", "autant","autour", "autrefois", "autrement", "avant", "avec", "beaucoup","bien", "bientôt", "car", "ceci", "cela","cependant", "certes","chez", "comme", "comment", "chaque", "dans", "davantage", "de","dedans", "dehors", "déjà", "demain", "depuis", "dès", "dès lors", "dès que", "désormais", "dessous", "dessus", "devant", "donc", "dont", "dorénavant", "durant", "d’abord", "encore", "enfin", "ensuite", "entre","envers", "exprès", "faim", "gré", "guère", "hélas", "hier", "hors", "ici", "jamais","là-bas", "legs", "loin", "longtemps", "lorsque", "maintenant", "mais", "malgré", "matelas", "merguez", "mieux", "mil","mille", "moins", "néanmoins", "non", "os", "or", "ou", "oh", "oasis", "par", "par-dessous", "par-dessus", "parce que", "parfois", "parmi", "pas", "pendant", "pénis", "peu", "phallus", "plus", "plusieurs", "plutôt", "pour", "pourquoi", "pourtant", "près", "presque", "puis", "quand", "quant à au aux", "quelquefois", "quoi", "quoique", "sans", "sauf", "selon", "seulement", "sinon", "sitôt", "soudain", "sous", "souvent", "surtout", "tant", "tant mieux", "tant pis", "tantôt", "tard", "tôt", "toujours", "toutefois", "travers", "très", "trop", "vers", "voici", "voilà", "volontiers", "vraiment" ); foreach ($phrase as $mot) { //Si le mot se termine par ail if (in_array($mot, $exception_ail)) { $return .= $exception_ail[$mot] . " "; }elseif (in_array($mot, $exception)){ $return .= $mot . " "; }elseif (preg_match('/d\'[a-zA-Z]*/', $mot)) { $return .= $mot . " "; }else{ $return .= substr($mot, 0, -1) . ' '; } } return substr($return, 0, -1); }
La liste des exceptions n’est pas exhaustive ! Et certainement qu’il manque quelques règles.
Par exemple : “Poires de Paul” devrais donner “Poire de Paul”, mais la fonction r’enverra “Poire de Pau” … Ce qui n’est pas vraiment pareil !
Si vous avez des idées pour l’améliorer n’hésitez pas à me le faire savoir !
Bonne journée.