Converter plural para singular

Outro dia reparei que a busca do Clube de Preços não tinha tratamento para palavras no plural, então resolvi ir atrás das regras do português e escrever uma função em PHP para converter plural para singular.

O resultado foi:

<?php
/**
 * Converte uma palavra no plural para o singular
 * @param string $str Uma palavra
 * @return string Palavra no singular
 */
function pluraltosingular($str) {
	if (substr($str, -1) != 's')
		return $str;
	// albuns batons marrons
	if (substr($str, -2, 1) == 'n')
		return substr($str, 0, -2) . 'm';
	// flores gizes vezes tenis
	else if (strpos('aeou', substr($str, 0, 1)) === false && substr($str, -2, 1) == 'e' && strpos('nrsz', substr($str, -3, 1)) !== false)
		return substr($str, 0, -2);
	// aneis anzois jornais
	else if (substr($str, -2) == 'is' && strpos('aeiou', substr($str, -3, 1)) !== false)
		return substr($str, 0, -2) . 'l';
	// frances portugues
	else if (substr($str, -2) == 'es' && strpos('clu', substr($str, -3, 1)) !== false)
		return $str;
	// caes paes
	else if (substr($str, -3) == 'aes')
		return substr($str, 0, -2) . 'o';
	// leoes
	else if (substr($str, -3) == 'oes')
		return substr($str, 0, -3) . 'ao';
	// exceto onibus lapis tenis arvores
	else if (strpos('ius', substr($str, -2, 1)) === false && substr($str, -3, 1) != 'n')
		return substr($str, 0, -1);
	return $str;
}
?>

Você pode usar com expressão regular de captura de palavras para converter todas as palavras de uma string para o singular.

$text = preg_replace_callback('#[A-ZÀ-Úa-zà-ú]+(?:-[A-ZÀ-Úa-zà-ú]+)*#', 'pluraltosingular', $text);

Muito provável eu tenha esquecido de alguma regra. Um outro problema é com palavras de outros idiomas, como acontece no português x inglês. Caso encontre algum erro me envie ou faça um pull request no GitHub.

https://github.com/Moraga/PluralToSingular

You may also like...

  • Sugestão de embed de código: usa o gist do github. O código fica com a legibilidade melhor.

    Exemplo:

    • moraga

      Obrigado pela dica!

  • Felipe

    da erro quando a palavra termina com ‘s’ mas dai tem o caso de pavilhoes, nesse caso só retorna pavilhoe, tem alguma maneira de corrigir isso?