Skip to content

PHP : Singulariser une expression française.

Soyez sociable ! Partagez :
  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

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.

Soyez Sociable ! Partagez !
Published inTutoriel
  • David

    La meilleure (mais vraiment meilleure) des solutions serait d’avoir un dictionnaire singulier -> pluriel. tu pourrais ainsi mieux convertir vers l’un ou l’autre état.

    Autrement, pour pluraliser, on rajoute généralement un s. Pourquoi ne pas partir de cette règle pour singulariser ? retirer un s à la fin du mot s’il ne fait pas partir des exceptions ? (après, si tu as un prénom qui se termine en s, ce sera un peu gênant, mais ça pourrait faire partie des exceptions aussi (^__^) ). Compliqué et bcp de règles à gêrer, mais ça devrait suffire !

    A tantôt !

    • Oui, le dictionnaire complet serait le plus approprié, MAIS pas du tout optimisé WEB !

      Et certain mots ne doivent pas être singularisé (matelas…) d’où les exception, ou dans une expression, les mots précédés par “de” “d'”…

banner