-1

Esmiuçando operadores bit-a-bit - Parte 2

criado por Alisson Carlos de F. Rodrigues em 18/03/2007 9:15am
strtolower

Neste caso o importante são as letras em maiúsculo, que serão passadas para minúsculo (isso é óbvio, você não vai passar uma letra minúscula para minúscula). Lembre-se dos exemplos da página anterior, no primeiro caso você tem “A” e quer obter “a”, pra isso você usa o operador “|”, em PHP ficaria assim:

<?php
$novaLetra = ‘A’ | ‘ ‘;
?>

$novaLetra vai conter então o valor “a”.

strtoupper

É o mesmo caso no primeiro só que ao contrário, você tem a letra minúscula e quer passar para maiúsculo. No exemplo anterior você tinha “a” e queria obter “A”, para isso usou o operador “^”, em PHP ficaria assim:

<?php
$novaLetra = ‘a’ ^ ‘ ‘;
?>

Funções completas

As duas funções são bastante simples e semelhantes. Você precisa usar um pouco de ER, é uma ER simples, não precisa de muito “knowledge” pra entender. No caso do strtolower a ER vai pegar todas as letras maiúsculas (e somente elas) e jogar dentro do operador bit-a-bit. Usamos o modificador “e” em preg_replace (que, aliás, só é usado nessa função). Este modificador diz à função que deve ser executado código dentro do segundo parâmetro. No nosso caso, o código seria o operador bit-a-bit. Mesmo sendo código, este deve ser colocado dentro de aspas (esta é uma regra do operador “e”, você encontra explicação pra isso no site no PHP na parte de ERs no padrão perl). O código ficaria assim:

<?php
function strtolower2($texto)
{
    $novoTexto = preg_replace("#([A-ZÁÂÀÃÄÉÊËÈÍÎÏÌÓÔÒÕÖÚÛÙÜ])#e","'\\1' | ' '",$text);
    return $novaTexto;
}
?>

A função preg_replace vai substituir toda ocorrência de letra maiúscula por sua correspondente minúscula jogando-a no segundo parâmetro com o operador bit-a-bit “|”.

Pra função strtoupper é exatamente a mesma coisa, obviamente você deve mudar de maiúsculo para minúsculo e mudar o operador pra “^”:

<?php
function strtoupper2($text)
{
    $novoTexto = preg_replace("#([a-záâàãäéêëèíîïìóôòõöúûùü])#e","'\\1' ^ ' '",$text);
    return $novoTexto;
}
?>

Obviamente as funções originais apresentam um melhor desempenho já que são nativas e, portanto, são criadas diretamente na linguagem mãe (no caso do PHP é C). Uma função utilizando exatamente a mesma lógica nas duas linguagens teriam desempenhos diferentes, sendo mais rápido em C. Mesmo assim, fiz alguns testes aqui e cheguei à conclusão de que essa função leva em torno do dobro do tempo da função nativa. É um excelente resultado.

Na última página ainda temos alguns casos estranhos na forma como o PHP lida com operadores bit-a-bit (ou com a tabela ASCII).

Comentários:

Mostrando 1 - 5 de 5 comentários
Olá

O PHP usa a tabela de caracteres ANSI e não ASCII somente.

A tabela ANSI (American National Standards Institute) é constituída da tabela ASCII (0 a 127) e mais `Latin 1 Windows´ (128 a 255)

Vejam http://ascii-table.com/ansi-codes.php

Por isso o PHP consegue fazer o uppper e o lower com caracteres acentuados utilizando os operadores ^ e | .

Espero ter ajudado.

XXande ;)
09/10/2013 2:13pm (~11 anos atrás)

^ => xor
14/04/2007 7:14am (~17 anos atrás)

Diego disse:
Mto bom...ja utilizava esse metodo aqui no trampo! ^^
09/04/2007 7:18am (~17 anos atrás)

Alisson, este artigo está ótimo...
Porém é algo raramente utilizado em php, acredito que poucos hoje já tiveram problemas que isto ajudaria a resolver!
Abraço,
Felipe
04/04/2007 8:39pm (~17 anos atrás)

O artigo ficou tão ruim assim pra não receber nenhum comentário e ter nota 6.33?
02/04/2007 7:47am (~17 anos atrás)

Novo Comentário:

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