Inflexão: Singularização e Pluralização de palavras simples
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:
Faz-se necessário a atualização do array $exceptions sempre que uma nova exceção for encontrada, para o perfeito funcionamento.
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 |
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)
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.
Voltando "ônibus" para as exceções.
12/03/2010 9:41pm
(~14 anos atrás)
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. :)
"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:
Tem o mesmo resultado que:
Embora a segunda alternativa seja mais rápida.
E esse trecho:
Pode ser simplificado assim:
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:
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)
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.
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:
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.
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)