0

Inflexão: Singularização e Pluralização de palavras simples

criado por Klawdyo em 11/03/2010 1:03pm
Converte palavras para o plural ou para o singular respeitando as regras do português, como palavras terminadas em ês, x, z, ão, l, m, r, etc. Também existe a possibilidade acrescentar exceções às regras.

Para usar:

<?php

  //Do plural para o singular
  echo Inflector::singularize('aviões');    //avião
  echo Inflector::singularize('cidadãos');  //cidadão
  echo Inflector::singularize('sofás');     //sofá
  echo Inflector::singularize('burgueses'); //burguês
  echo Inflector::singularize('matrizes');  //matriz
  echo Inflector::singularize('móveis');    //móvel
  echo Inflector::singularize('catéteres'); //catéter

  //Do singular para o plural
  echo Inflector::pluralize('casa');     //casas
  echo Inflector::pluralize('xadrez');   //xadrezes
  echo Inflector::pluralize('mãe');      //mães
  echo Inflector::pluralize('qualquer'); //quaisquer
  echo Inflector::pluralize('ônibus');   //ônibus

?>

Faz-se necessário a atualização do array $exceptions sempre que uma nova exceção for encontrada, para o perfeito funcionamento.
Data Autor Changelog Download
11/03/2010 1:03pm Klawdyo - Versão 0.1
12/03/2010 11:14am Klawdyo Versão 0.11 Versão 0.11
12/03/2010 10:05pm Klawdyo Versão 0.2 Versão 0.2

Comentários:

Mostrando 1 - 7 de 7 comentários
Klawdyo disse:
Blz. Aproveitando as sugestões, pluralize() só adiciona um "s" caso a última letra não seja um.
12/03/2010 9:48pm (~14 anos atrás)

Klawdyo disse:
Outra observação que havia me passado despercebido é em relação às palavras terminadas em 'u', como 'chapéu' e 'troféu'. Elas apenas recebem o "s" no final. Nesse caso, teria que tratar "ônibus" como exceção, pois caso tentasse singularizar "chapéus" eu receberia o próprio "chapéus" devido à regra "us->us".

Voltando "ônibus" para as exceções.
12/03/2010 9:41pm (~14 anos atrás)

Klawdyo disse:
Vamos aos comentários. Novamente, extremamente pertinentes as suas sugestões.
"lápis" é um exemplo claro de uma exceção, e já adicionei. Eu havia adicionado no original, mas acabei removendo antes de enviar o código.

Quanto à palavra mês, ela funciona normalmente. Ela cai na mesma regra de "burguês", "freguês", etc, palavras terminadas em "ês -> eses".

Quanto às demais sugestões, acabei de implementá-las. Daqui a uns minutos o código estará on-line.

Valeu pela força e continue enviando suas observações. :)
12/03/2010 9:19pm (~14 anos atrás)

Opa, agora está melhor.

Mais outras pequenas observações que vi depois:

in_array($word, array_keys(self::$exceptions))

Tem o mesmo resultado que:
array_key_exists($word, self::$exceptions);

Embora a segunda alternativa seja mais rápida.

E esse trecho:
substr($word, 0, strlen($word) - 1);

Pode ser simplificado assim:
substr($word, 0, -1);

Algumas palavras a verificar:
mês - meses
lápis - lápis

E na singularização, só deve remover o último símbolo se ele for um "s", não? Pra ver a última letra, use:
substr($word, -1);
12/03/2010 8:59pm (~14 anos atrás)

Klawdyo disse:
Blz. Classe atualizada com as sugestões do Rubens.
12/03/2010 12:30pm (~14 anos atrás)

Klawdyo disse:
Cara. Bastante providenciais as suas observações. Falha gravíssima mesmo.
Em dezenas de testes, por coincidência, não testei nenhuma palavra que me fizesse observar o erro do str_replace. Falha mesmo. Às vezes é necessário dar uma arejada pra ver certos erros que estão na nossa cara. Agora eu estou vendo e me perguntando como não observei isso. Valeu mesmo.

Quanto ao "campus/campi", também acato sua observação. E também acato a questão dos métodos estáticos. heheheeh

Valeu. Daqui a pouco coloco outra versão.
11/03/2010 9:12pm (~14 anos atrás)

A ideia é boa, mas tem um erro grave. Experimente a palavra "lamaçal". Ele troca todas as ocorrências de "l" por "is", obtendo como resultado "isamaçais".

Você pode trocar str_replace por preg_replace. Por exemplo:
preg_replace('/(l)$/', 'is', 'lamaçal');

Campus/campi são palavras em latim, acho que deveria ser considerada uma exceção. Afinal, o plural de ônibus não é ônibi.

Sugestão: poderia deixar os atributos e os métodos estáticos, afinal, a classe não caracteriza uma entidade com valores e comportamentos, mas sim um pacote com duas funções isoladas com um propósito relacionado.

11/03/2010 9:02pm (~14 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)