Esmiuçando operadores bit-a-bit - Parte 2
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:
$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:
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:
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 “^”:
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).
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).
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
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)
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 ;)