Friday, July 23, 2010
Thursday, July 22, 2010
Expressões Regulares
A intenção deste post é organizar num lugar as principais e mais simples características das expressões regulares. Desta forma serve tanto para quem está começando para quem deseja consultar.
Então, vamos lá!
O que são expressões regulares?
São conjutos de caracteres e símbolos que, quando agrupados corretamente, formam uma expressão.
"É como o brinquedo LEGO, várias pecinhas diferentes, cada uma com sua característica, que juntas compõem estruturas completas e podem ser arranjadas com infinitas combinações diferentes." guia-er
Para que servem?
Expressões regulares ajudam a você definir padrões mais específicos que te ajudarão a buscar e/ou alterar em um contexto mais abrangente.
Exemplo
[rpg]ato combinará com: gato, rato e pato.
Mas expressões vão muito além disto, no dia-a-dia seu uso é muito prática para manipular diversos dados como: data/hora, endereço de email, telefones, cpf, conteudos de , praticamente qualquer coisa!
Mãos a massa!
Metacaracteres
| Representantes | Definição | Exemplos | ||
|---|---|---|---|---|
| . | ponto | Um caractere qualquer | Casa com qualquer coisa, inclusive com si próprio | n.o = não, nao, ... 13.15 = 13:15, 13 15, 13.15 |
| [] | lista | [...] - Lista de caracteres permitidos | Casa quem quem conhece. Dentro da lista, todo mundo é "normal". - significa intervalo | [0123456789] = [0-9] n[ãa]o = não, nao a-z, A-Z pega "[\]^_" mas não pega os caracteres acentuados "aéóõç". |
| [^] | lista negada | [^...] - Lista de caracteres proibidos | Segue todas as regras de uma lista "comum" ^ não deve ser o primeiro item da lista. A lista negava deve casar algo | [^0-9] casa tudo que não for número, inclusive espaços em branco, símbolos, letras, qualquer coisa. |
| Quantificadores | Indicam o número de repetições permitidas para a entidade anterior | exemplos | ||
| ? | opcional | zero ou um | Torna o caracter anterior opcional é util para procurar palavras no singular e pluar | carros? carro, carros |
| * | asterisco | zero, um ou mais | A entidade anterior pode aparecer em qualquer quantidade. | 6*0 = 0, 60, 660, 6660, ..., 66666666666666660, ... |
| + | mais | um ou mais | Funcionamento idêntico ao *, a única diferença é que o + não é opcional. A entidade anterior tem que casar pelo menos uma vez. | 6+0 = 60, 660, ..., 666666666660, ... bi+p = bip, biip, biiip, biiiip, ... |
| {n,m} | chaves | de n até m | Solução controlada para especificar exatamente quantas repetições se deseja da entidade anterior Você pode especificar um úmero exato, um mínimo, um máximo ou uma faixa numérica. | {1,5} = de 1 a 5 {5,} = pelo menos 5 {3} = exatamente 3 |
| Âncoras | Caracteres que marcam uma posição específica na linha | Exemplos | ||
| ^ | circunflexo | Marca início de uma linha. ^Só tem esta função no começo da linha. | ^[0-9] = O primeiro item da linha deve ser um número | |
| $ | cifrão | fim da linha | ^$ Linha vazia ^.{10,20}$ = Linha que tenha entre 10 e 20 caracteres | |
| \b | borda | início ou fim de uma palavra | O conceito "palavra" engloba letras, número e sublinhado | dia = dia, diafragma, melodia, bom-dia \bdia = dia, diafragma, bom-dia dia\b = dia, melodia, bom-dia \bdia\b = dia, bom-dia |
| Outros | Exemplos | |||
| \ | escape | torna literal o caractere literal | \* = [*] = asterisco literal \. = . \\ = \ | |
| | | ou | um ou outro | .[php|html] | |
| () | grupo | delimitador de um grupo | (ha!)+ ha!, ha!ha!, ha!ha!ha!, ... (super|hiper)mercado | |
| \1 | retrovisor | \1...\9 - Texto casado nos grupos 1...9 | (quero-\1) quero-quero ([A-Za-z]+)-\1 (lenta)(mente) é \2 \1 lentamente é mente lenta | |
Todo conteúdo acima foi inspirado no livro e site abaixo. Quem se interessar corra atrás, compre o livre, porque vale muito a pena!
http://guia-er.sourceforge.net/
Tuesday, July 20, 2010
Usando jQuery para procurar no HTML
O que vamos fazer?
Como?
A estrutura HTML do exemplo
<div id="search">
<input type="text" name="q" />
</div>
<ul id="content">
<li>Donec posuere lobortis urna, sit amet adipiscing purus blandit vel.</li>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi.</li>
<li>Praesent dapibus, neque id cursus faucibus. </li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus.</li>
<li>Duis tempus turpis in neque sagittis at adipiscing. Nulla congue turpis ac turpis aliquet placerat.</li>
<li>Pellentesque fermentum dolor.</li>
</ul>
JS
$(function(){
/**
* Fix para desabilitar o case-sensitive
**/
$.expr[':'].icontains = function(obj, index, meta, stack){
return (obj.textContent || obj.innerText || jQuery(obj).text() || '').toLowerCase().indexOf(meta[3].toLowerCase()) >= 0;
};
$("div#search input[type=text]").keydown(function(e){
var $input = $(this);
if($input.val() != ''){
$('ul#content li').hide();
$('ul#content li:icontains('+$input.val()+')').show();
}
});
});
CSS Opcional
body{
margin:0;
}
div#search{
background:#ddd;
border-bottom:1px solid #bbb;
padding:3px 10px;
}
div#search input[type=text]{
border:1px solid #aaa;
width:100%;
font-size:16px;
}
ul#content{
margin:0;
padding:0;
list-style:none;
}
ul#content li{
background:#E0EDFF;
border-bottom:1px solid #BACCE6;
padding:3px 5px;
}
Exemplo de uso
Um bom lugar parar usar esta técnica é numa lista de contatos de um chat, por exemplo. Você irá procurar automaticamente sem precisar atualizar ou enviar muitas requisições ajax. Apenas pergunte ao seu HTML! (:Atalhos de Teclado com jQuery
O código Básico:
$(function(){
$('body').keydown(function(e){
e.preventDefault();
if(e.keyCode==13){ // enter
// ação
}
});
});
OBS: Você pode usar para um elemento específico ao invés do 'body', um input, por exemplo.No final do post você vai ver como fazer o mesmo para atalhos "CTRL+TECLA".
Mas o que é um keyCode? E onde os encontro?
Aqui:| Tecla (key) | Código (Key Code) | backspace | 8 |
|---|---|
| tab | 9 |
| enter | 13 |
| shift | 16 |
| ctrl | 17 |
| alt | 18 |
| pause/break | 19 |
| caps lock | 20 |
| escape | 27 |
| page up | 33 |
| page down | 34 |
| end | 35 |
| home | 36 |
| left arrow | 37 |
| up arrow | 38 |
| right arrow | 39 |
| down arrow | 40 |
| insert | 45 |
| delete | 46 |
| 0 | 48 |
| 1 | 49 |
| 2 | 50 |
| 3 | 51 |
| 4 | 52 |
| 5 | 53 |
| 6 | 54 |
| 7 | 55 |
| 8 | 56 |
| 9 | 57 |
| a | 65 |
| b | 66 |
| c | 67 |
| d | 68 |
| e | 69 |
| f | 70 |
| g | 71 |
| h | 72 |
| i | 73 |
| j | 74 |
| k | 75 |
| l | 76 |
| m | 77 |
| n | 78 |
| o | 79 |
| p | 80 |
| q | 81 |
| r | 82 |
| s | 83 |
| t | 84 |
| u | 85 |
| v | 86 |
| w | 87 |
| x | 88 |
| y | 89 |
| z | 90 |
| left window key | 91 |
| right window key | 92 |
| select key | 93 |
| numpad 0 | 96 |
| numpad 1 | 97 |
| numpad 2 | 98 |
| numpad 3 | 99 |
| numpad 4 | 100 |
| numpad 5 | 101 |
| numpad 6 | 102 |
| numpad 7 | 103 |
| numpad 8 | 104 |
| numpad 9 | 105 |
| multiply | 106 |
| add | 107 |
| subtract | 109 |
| decimal point | 110 |
| divide | 111 |
| f1 | 112 |
| f2 | 113 |
| f3 | 114 |
| f4 | 115 |
| f5 | 116 |
| f6 | 117 |
| f7 | 118 |
| f8 | 119 |
| f9 | 120 |
| f10 | 121 |
| f11 | 122 |
| f12 | 123 |
| num lock | 144 |
| scroll lock | 145 |
| ; | 186 |
| = | 187 |
| , | 188 |
| - | 189 |
| . | 190 |
| / | 191 |
| grave accent | 192 |
| open bracket | 219 |
| back slash | 220 |
| close braket | 221 |
| ' | 222 |
Atalhos "CTRL + Key"
var isCtrl = false;
$(document).keyup(function (e) {
if(e.which == 17)
isCtrl=false;
}).keydown(function (e) {
if(e.which == 17) isCtrl=true;
if(e.which == 83 && isCtrl == true) {
// executa código para CTRL+S return false;
}
});
Monday, July 19, 2010
MySql - Updating Duplicated Entries Made Easy
CREATE TABLE IF NOT EXISTS `mydb`.`Counter` ( `idCounter` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(30) NULL , `hits` INT NULL , PRIMARY KEY (`idCounter`) );
Our SQL code
INSERT INTO Counter (idCounter,name, hits) VALUES (1,'myBlog',1) ON DUPLICATE KEY UPDATE hits=hits+1
As simple as that
CSS3 Cross-Browser
.box_round {
-moz-border-radius: 12px; /* FF1+ */
-webkit-border-radius: 12px; /* Saf3+, Chrome */
border-radius: 12px; /* Opera 10.5, IE 9 */
}
.box_shadow {
-moz-box-shadow: 0px 0px 4px #ffffff; /* FF3.5+ */
-webkit-box-shadow: 0px 0px 4px #ffffff; /* Saf3.0+, Chrome */
box-shadow: 0px 0px 4px #ffffff; /* Opera 10.5, IE 9.0 */
}
.box_gradient {
background-image: -moz-linear-gradient(top, #444444, #999999); /* FF3.6 */
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #444444),color-stop(1, #999999)); /* Saf4+, Chrome */
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#444444', EndColorStr='#999999'); /* IE6,IE7 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#444444', EndColorStr='#999999')"; /* IE8 */
}
.box_rgba {
background-color: #B4B490;
background-color: rgba(180, 180, 144, 0.6); /* FF3+, Saf3+, Opera 10.10+, Chrome */
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#99B4B490',EndColorStr='#99B4B490'); /* IE6,IE7 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#99B4B490',EndColorStr='#99B4B490')"; /* IE8 */
}
.box_rotate {
-moz-transform: rotate(7.5deg); /* FF3.5+ */
-o-transform: rotate(7.5deg); /* Opera 10.5 */
-webkit-transform: rotate(7.5deg); /* Saf3.1+, Chrome */
filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand',
M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104); /* IE6,IE7 */
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand',
M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104)"; /* IE8 */
zoom: 1;
}
.box_transition {
-moz-transition: all 0.3s ease-out; /* FF3.7+ */
-o-transition: all 0.3s ease-out; /* Opera 10.5 */
-webkit-transition: all 0.3s ease-out; /* Saf3.2+, Chrome */
}
@font-face {
font-family: 'WebFont';
src: url('myfont.eot'); /* IE6+ */
src: local('☺'),
url('myfont.woff') format('woff'), /* FF3.6 */
url('myfont.ttf') format('truetype'); /* Saf3+,Chrome,FF3.5,Opera10+ */
}
Source: css3please.com/
Sunday, July 18, 2010
Using label as place holder for input
So.. now that you see it, let's do it!
CSS
div.form{
margin:4px;
}
div.form div.simple{
margin:15px 0px;
}
div.form div.simple input{
background:transparent;
min-width:400px;
padding:7px;
font-size:15px;
border:1px solid #aaa;
}
div.form label{
color:#aaa;
position:absolute;
margin-left:5px;
}
Html structure
<div class="form">
<form action="" method="post">
<div class="simple">
<label for="nome">Nome</label>
<input type="text" name="nome" value="" />
</div>
<div class="simple">
<label for="email">Email</label>
<input type="text" name="email" />
</div>
<div class="action">
<input type="submit" value="Send" />
</div>
</form>
</div>
JS for hidding the label after user inserts a value
$('form input').focus(function(){
$(this).parent().find('label').hide();
}).blur(function(){
if($(this).val()==''){
$(this).parent().find('label').show();
}
});
And there you go! As simple as that!
Atualização Automática de Conteúdo com jQuery
É tão bom e ao mesmo tempo tão simples! Perfeito para nós :D
Então vamos mostrar para você como usar jQuery para criar um simple e eficiente autalizador automático de conteúdo.
Html:
<html>
<head>
<title>Conteúdo Automático</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<div id="receptor"></div>
</body>
</html>
Javascript:
<script type="text/javascript">
$(function(){
var tempoAtualizacao = 0;
function atualiza(){
$.get('refresh.php',{},function(resposta){
$('#receptor').html(resposta);
tempoAtualizacao = setTimeout(atualiza,15000); // we set the loop
});
}
function cancelaAtualiza(){
clearTimeout(tempoAtualizacao);
}
atualiza(); // chamamos pela primeira vez a atualização
});
</script>
Agora vamos entender.
$.get() é uma função do jQuery que envia a requisição GET. $.get tem 3 parâmetros, o primeiro é a URL, o segundo são parâmetros a serem passados (se necessário) e o terceiro é a resposta.
Algo assim:
$.get(url, parametros,function(resposta){...});A url deve redirecionar para seu arquivo .php (.html ou qualquer outra linguagem) que vai administrar a requisição, retornando a resposta.
A função setTimeout cria uma espécie de loop, chamando novamente a nossa função a cada 15000 ms.
Para cancelar a atualização automática basta simplesmente chamar a função cancelaAtualiza();
OBS: Você pode usar $.get, $.post ou até mesmo $.load.
Classe Formatadora com Expressões Regulares
A classe consiste em duas partes, a primeira é uma variável chamada $formats onde nós guardamos as expressões regulares e uma função chamada format, onde executamos tudo.
class Formater{
public static $formats=array(
'date2sql' => array("'^([0-9]{2}).([0-9]{2}).([0-9]{4})'","$3-$2-$1"),
'sql2date' => array("'^([0-9]{4}).([0-9]{2}).([0-9]{2})'","$3/$2/$1"),
);
public static function format($string,$type) {
if (!isset(self::$formats[$type])) return $string;
$find = self::$formats[$type][0];
$replace = self::$formats[$type][1];
return preg_replace($find,$replace,$string);
}
}
// Mode of use - Como usar
$date1 = Formater::format('2010-08-01','sql2date'); // returns 01/08/2010
$date2 = Formatter::format('01/08/2010','date2sql'); // returns 2010-08-01
Você pode usar para o que precisar! Tudo que você precisa fazer é adicionar sua regex na var $formats e pronto!
Este é o tipo de classe que você precisará em todo o projeto que você faça!
Simple $_GET and $_POST request manager
Esta é uma função muito simples porém extremamente útil.
class Request{
public static function getParam($name,$default = null) {
return isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $default);
}
}
//mode of use - como usar
$var = Request::getParam('name','defaultValue');
Limpando seu HTML
As pessoas estão usando:
$html = "
- " . $var . "
";
echo $html;
?>
ao invés de:
- <?php echo $var;?>
Outra situação comum é:
<table>
<?php
foreach($var as $k=>$v){
echo "<tr>";
echo "<td>".$v."</td>";
echo "</td>";
}
?>
</table>
E como lidar com ela:
<table>
<?php foreach($var as $k=>$v):?>
<tr>
<td><?php echo $v;?></td>
</tr>
<?php endforeach;?>
</table>
Outra situação muito útil é quando usamos o if
if($a==$b){
//lot of codes here
} else {
// more code..
}
alternativa:
<?php if($a==$b):?>
// code
<?php endif;?>
// or
<?php if($a==$b):?>
// codes
<?php else: ?>
// codes
<?php endif;?>
Há uma outra alternativa para o if que é MUITO útil:
$a = $b==$c ? true : false ;
As situações descritas acimas são bem simples mas muito importantes. Se seu código está limpo tudo fica mais fácil, e é isto que queremos, certo?
Dê uma chance! É muito bom tirar vantagens dessas sintaxes alternativas:
for: endfor;
foreach: endforeach;
while: endwhile;
switch: endswitch;
if: endif;
Hi! My name is..
But wait.. what's Rint?
Rint is an attempt to let internet easier at first for web developers.
Face the facts, today is really hard to search and find good sources where you can get anything else but a full (including stuff you do not want) and complex codes and concepts. That's not cool, that's not productive. That's not what we want.
What I want to bring you here is the simpliest code and concept to let you really understand how coding works and how you may adjust it to your own project. As simple as that.
Well, I hope you enjoy this!
And as a brazilian I will publish a portuguese version of all my posts too, as bellow!
Thanks,
Luiz Eduardo! Sou desenvolvedor web do Brasil e estou começando este novo projeto chamado Rint
Mas o que é Rint?
Rint é uma tentativa de deixar a internet mais fácil, a princípio para os desenvolvedores.
Encare a realidade, hoje é muito difícil procurar e encontrar boas fontes onde você pode conseguir algo além de códigos e conceitos complexos e completos (incluindo coisas que você não quer/precisa). Isso não é bom, não é produtivo. Não é o que queremos.
O que eu quero trazer aqui para vocês são os conceitos e códigos mais simples para que você realmente entenda como as coisas funcionam e como você pode adaptá-los para seu próprio projeto. Simples assim.
Espero que vocês gostem!
Todos os meus posts estarão disponíveis também em inglês!
Valeu,



