Fork me on GitHub

Grupo de desenvolvedores de PHP do estado de São Paulo
Próximos encontros e eventos? Visite a página do PHPSP no Meetup

Salvem os bebês foca: Espaços duplicados

Por em em Notícias

Bebê Foca

Bebê Foca

Programar pode ser uma tarefa árdua ou gratificante e geralmente isso está relacionado com o tipo de código que você está mexendo. Existem vários tipos de código, mas o mais repulsivo sempre é o Spaguetti: uma maçaroca generalizada de todas as coisas, páginas que ultrapassam as milhares de linhas geralmente codificadas por pessoas que não acreditam no uso de funções e boas práticas de desenvolvimento (não vou nem cogitar Orientação a Objetos).

Agora, existem também os desenvolveres sobrinhos criativos. Eles se esforçam (ou não) mas acabam por não chegar lá, falhando miseravelmente em sua tentativa frustrada de resolver um problema. Na verdade eles resolvem, não o problema em si mas o resultado do problema e quando isso acontece, um inocente bebê foca é morto violentamente por uma facção de desenvolvedores xiitas.

O problema

É incrível como podemos sempre contar com os usuários. Existe uma síndrome constante que se espalha como praga no mundo: espaços duplos. Não sei o porquê disso, mas é incrível como sempre precisamos tratar espaços duplicados dentro das nossas aplicações a fim de não quebrar o layout ou ferrar com todo o design imaculado de um portal.

Vamos a primeira tentativa do nosso querido amigo:

[php]
function remover_espacos_duplos($texto) {
$texto = str_replace(" "," ", $texto);
$texto = str_replace(" "," ", $texto);
return $texto;
}
[/php]

Com o tempo nosso sobrinho percebeu que poderiam haver mais que dois ou três espaços e que essa função não era a solução pro problema. Não demorou e surgiu a versão 2.0 da função:

[php]
function remover_espacos_duplos($texto) {
$espacos = array(" "," "," "," ");
foreach ( $espacos as $espaco ) {
if ( strpos($texto, $espaco) !== false ) {
$texto = str_replace($espaco, ‘ ‘, $texto);
}
}
return $texto;
}
[/php]

Há! Bem melhor agora! Agora ela contempla até 5 espaços consecutivos. Já imaginou quando alguém colocar 20 espaços consecutivos? Como será que nosso amiguinho iria resolver? Que Deus proteja os bebês foca.

A solução

Para evitar que o pessoal copie as funções acima sem ler o post e consequentemente entender que se trata de uma brincadeira e de como não resolver o problema, vamos sempre propor uma solução, e pra esta a melhor é:

[php]
function remover_espacos_duplos($texto) {
return preg_replace(‘/\s\s+/’, ‘ ‘, $texto);
}
[/php]

Ajude a salvar bebês foca

Nos envie algum código de sobrinho que você achou por aí. Não precisamos de nomes, mas uma história é sempre interessante. Envie um email para sobrinhagem@phpsp.org.br

Sobre Augusto Pascutti

Augusto Pascutti é desenvolvedor web e evangelista XKCD, não necessariamente nesta ordem.

Mais posts de .

  • It is always better to use regular expressions instead of manual char parsing. Unless heavily used, performance won’t be an issue.

    Un saludo desde Perú!

  • Muito bom,

    o engraçado e ao mesmo tempo preocupante é que essas soluções de sobrinhos estão espelhadas por ai, basta fazer uma simples busca no google, logo você encontra varios blogs com mini tutoriais com soluções que eu diria incompletas ou que acarretam outros erros no futuro.

  • Pingback: Tweets that mention Salvem os bebês foca: Espaços duplicados | phpsp.org.br -- Topsy.com()

  • Rodrigo Rigotti

    Por que \s\s+? Apenas um \s+, até onde eu sei, já resolve.

  • Nossa muito legal! quase caí de tanto rir… rsrsrsrs…

    @Rodrigo Rigotti, \s\s+ para não remover apenas um espaço, mas sim a partir de 2 espaços seguidos!

    Só lembrando:

    .+ (a partir de 1 ou mais de qualquer caracter);
    .* (a partir de nenhum ou mais de qualquer caracter);

    Se quiser um range pode usar:

    \s{3,6} (a partir de 3 até 6 espaços seguidos);
    \s(4,} (a partir de 4 espaços seguidos);

    Abraços!

  • Antes de criticar é fundamental saber quais circunstâncias levaram a pessoa a programar daquela maneira. Já me encontrei em uma situação onde tive de recriar uma função que o PHP já disponibiliza, porque não tinha certeza em qual versão meu aplicativo iria rodar.
    Responsabilizar os ‘sobrinhos’ por códigos desse tipo é forçação de barra. Já vi programadores/desenvolvedores profissionais escrevendo códigos bem piores que o desse exemplo, então é importante ir com calma. A própria solução apresentada não é a mais otimizada, assim dá pra entender melhor o que quero dizer.
    ‘Sobrinho’ não é sinônimo de mal programador, é um estilo de vida.

  • @Eduardo: acho que você não entendeu a brincadeira.

    Sobrinho é a pessoa com falta de conhecimento e falta de força de vontade pra aprender, é uma brincadeira sadia que fazemos a anos. Concordo em um ponto: um sobrinho não é um mal programador. Ele não chega a ser um programador. E é aí que mora o problema.

    Quanto a solução, posso ter sido prepotente em dizer que era a “melhor”. Sinceramente, é difícil otimizar mais essa tarefa do que com a aplicação de expressão regular; mas é importante lembrar que uma das coisas mais importante é a manutenção de código, e nesse caso não conheço nada mais direto e simples do que a inocente expressão regular utilizada.

    Mas sinta-se a vontade pra propor novas soluções ou alternativas diferentes. E lembre-se: Isso tudo é uma brincadeira; todo mundo erra e isso é óbvio …. se de alguma forma você se sentiu ofendido minhas sinceras desculpas; em nenhum momento a intenção foi atacar alguém, alguma coisa ou grupo.

  • @Augusto Pascutti

    Acho que me expressei mal, não me revoltei nem nada… rs
    Quanto ao uso da solução “expressão regular”, concordo que é a melhor solução. O que eu quis dizer no comentário é que aquela expressão especificamente pode não ser a mais recomendada, porque ela remove, além dos espaços, os caracteres “quebra de linha” e “tab”, o que não necessariamente é desejado.

    Ah, quanto aos sobrinhos, também não gosto deles! ;)

    Abraços

  • Edson

    A melhor solução como indicada pelo @Cléber Oliveira é /\s{2,}/gi

    Abs,

  • Cornélio José Wiedemann

    como eu sou descolado e safadao do php, eu só uso o trim

    hehe valeu djow

  • Misael Gomes

    php 5.6 isso não ta funcionando: return preg_replace(‘/s+/’, ‘ ‘, $string);

    terei que subistituir para isso

    return preg_replace_callback(‘/s+/’,function ($matches) {global $replacements;return $replacements[$matches[0]];},$string);

    não sei ainda se é a melhor forma de resolver :/