<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alejandro Moraga</title>
	<atom:link href="http://www.alejandromoraga.com.br/feed" rel="self" type="application/rss+xml" />
	<link>http://www.alejandromoraga.com.br</link>
	<description>O mundo é de quem desenvolve!</description>
	<lastBuildDate>Mon, 28 Feb 2011 18:43:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tempo de execução de script em PHP</title>
		<link>http://www.alejandromoraga.com.br/tempo-de-execucao-de-script-em-php</link>
		<comments>http://www.alejandromoraga.com.br/tempo-de-execucao-de-script-em-php#comments</comments>
		<pubDate>Tue, 28 Dec 2010 19:09:05 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[tempo de execução]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=242</guid>
		<description><![CDATA[&#60;?php function timer($k) { static $s = array(); // se a chave não existir é criado um tempo para ela if (empty($s[$k])) $s[$k] = microtime(true); // se ela existir é retornado a diferença entre o agora e o seu valor else return microtime(true) - $s[$k]; } ?&#62; Exemplos: // cria um momento para 1 timer(1); [...]]]></description>
			<content:encoded><![CDATA[<pre>&lt;?php

function timer($k) {
	static $s = array();

	// se a chave não existir é criado um tempo para ela
	if (empty($s[$k]))
		$s[$k] = microtime(true);

	// se ela existir é retornado a diferença entre o agora e o seu valor
	else
		return microtime(true) - $s[$k];
}

?&gt;</pre>
<p><strong>Exemplos:</strong></p>
<pre>// cria um momento para 1
timer(1);

sleep(3);

// cria um momento para 2
timer(1);

for ($i=0; $i < 100000000; $i++);

// mostra o tempo de execução para 2
echo timer(2);

// cria um momento para 3
timer(3);

file_get_contents('http://www.alejandromoraga.com.br/');

// mostra o templo de execução para 3
echo timer(3);

// mostra como seria voltar para 2
echo timer(2);

// mostra o tempo de 1, todas as execuções
echo timer(1);</pre>
<p><strong>Resultados</strong></p>
<pre>9.24874997139 (momento 2 - laço de 100000000 repetições)
0.300006866455 (momento 3 - requisição)
9.54882502556 (momento 2 - acresc)
12.5501468182 (somatória, incluíndo os 3 segundos iniciais)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/tempo-de-execucao-de-script-em-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interface com abas</title>
		<link>http://www.alejandromoraga.com.br/interface-com-abas</link>
		<comments>http://www.alejandromoraga.com.br/interface-com-abas#comments</comments>
		<pubDate>Thu, 09 Dec 2010 08:32:29 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Abas]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=239</guid>
		<description><![CDATA[Exemplo. Testado no IE7, IE8, Chrome e Firefox. A primeira tarefa é criar o HTML. Nada muito complicado, abas em li e o conteúdo em div. Tudo mantido dentro de uma div principal que usaremos para executar o jQuery. &#60;div class="tabs"&#62; &#60;ul&#62; &#60;li class="in"&#62;Item 1&#60;/li&#62; &#60;li&#62;Item 2&#60;/li&#62; &#60;li&#62;Item 3&#60;/li&#62; &#60;li&#62;Item 4&#60;/li&#62; &#60;/ul&#62; &#60;div style="display:block"&#62; Conteúdo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.alejandromoraga.com.br/wp-content/uploads/2010/12/tabs.html">Exemplo</a>. Testado no IE7, IE8, Chrome e Firefox.</p>
<p>A primeira tarefa é criar o HTML. Nada muito complicado, abas em <code>li</code> e o conteúdo em <code>div</code>. Tudo mantido dentro de uma <code>div</code> principal que usaremos para executar o jQuery.</p>
<pre>&lt;div class="tabs"&gt;
	&lt;ul&gt;
		&lt;li class="in"&gt;Item 1&lt;/li&gt;
		&lt;li&gt;Item 2&lt;/li&gt;
		&lt;li&gt;Item 3&lt;/li&gt;
		&lt;li&gt;Item 4&lt;/li&gt;
	&lt;/ul&gt;
	&lt;div style="display:block"&gt;
		Conteúdo do item 1
	&lt;/div&gt;
	&lt;div&gt;
		Conteúdo do item 2
	&lt;/div&gt;
	&lt;div&gt;
		Conteúdo do item 3
	&lt;/div&gt;
	&lt;div&gt;
		Conteúdo do item 4
	&lt;/div&gt;
&lt;/div&gt;</pre>
<p>Na aba que decidir iniciar o conteúdo coloque <code>class="in"</code> e na <code>div</code> corresponde <code>style="display:block"</code>. Pode ser na primeira aba, segunda, terceira ou qualquer outra.</p>
<p>A próxima tarefa é o CSS. A partir do CSS básico mostrado aqui, faça suas implementações, mude cores, fundos, bordas, etc.</p>
<pre>.tabs &gt; ul {
	bottom: -1px;
	color: #606060;
	margin: 0;
	padding: 0;
	position: relative;
	overflow: hidden;
}

.tabs &gt; ul li {
	background: #d2d6d9;
	color: #858f98;
	cursor: pointer;
	display: block;
	font-weight: bold;
	float: left;
	margin-right: 3px;
	padding: 3px 5px;
	position: relative;
}

.tabs .in {
	border-color: #ccc;
	border-style: solid;
	border-width: 1px 1px 0;
	color: #666;
	cursor: default;
	z-index: 1;
}

.tabs &gt; div {
	border: 1px solid #ccc;
	display: none;
	padding: 10px;
	overflow: hidden;
}

.tabs .in, .tabs &gt; div {
	background-color: #f5f5f5;
}</pre>
<p>Agora vem o Javascript. Leia os comentários no código para entender melhor o funcionamento do plugin.</p>
<pre>&lt;script type="text/javascript"&gt;
(function($) {
	$.fn.extend({
		tabs: function(options) {
			options = $.extend({
				// velocidade de troca das abas
				transition: 'normal',
				// ativa ou desativa a mundança automática
				autotab: false,
				// tempo de permencia em cada aba
				delay: 5000,
			}, options);

			return this.each(function() {
				var self = $(this), tabs = self.children('ul').children(), divs = self.children('div'), i = 0, timer = null;

				// adiciona um evento para que no clique as abas sejam trocadas
				tabs.click(function() {
					tabs.removeClass('in');
					$(this).addClass('in');
					divs.hide();
					// encontra a posição da aba clicada
					i = tabs.index(this);
					$(divs[i]).fadeIn(options.transition);
					// se a mudança automática estiver ativa, o temporizador é reiniciado
					if (options.autotab)
						resetTimer();
				});

				// executa a inicialização do temporizador
				if (options.autotab)
					startTimer();

				// função para iniciar o temporizador
				function startTimer() {
					timer = window.setInterval(showNext, options.delay);
				}

				// função para reiniciar o temporizador
				function resetTimer() {
					window.clearTimeout(timer);
					startTimer();
				}

				// função para mostrar a próxima aba
				function showNext() {
					// encontra a aba que deverá ser exibida
					if (tabs.length &gt; i + 1)
						i++;
					else
						i = 0;

					tabs.removeClass('in');
					$(tabs[i]).addClass('in');

					divs.hide();
					$(divs[i]).fadeIn(options.transition);
				}
			});
		}
	});
})(jQuery);
&lt;/script&gt;</pre>
<p><strong>Configuração</strong></p>
<p>Podemos configurar a duração do efeito de transição, troca automática de abas e o intervalo de exibição de cada aba.</p>
<p>Configuração padrão:</p>
<pre>{
	transition: 'normal',
	autotab: false,
	delay: 5000
}</pre>
<p><strong>Duração do efeito de transição</strong></p>
<p>O efeito de transição é o aparecer e desparecer da aba e do conteúdo. Aceita os valores: slow, normal, fast e o tempo milisegundos.</p>
<p><strong>Troca automática</strong></p>
<p>Por padrão as abas ficam fixas, somente são trocadas quando o usuário clica sobre uma aba. Ao definir o valor como <code>true</code> as abas se alternam conforme o tempo configurado no item abaixo.</p>
<p><strong>Intervalo de exibição de cada aba</strong></p>
<p>É o tempo que leva para de uma aba passar para outra. Modifique de acordo com o conteúdo exibido em suas abas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/interface-com-abas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução a programação orientada a objetos e herança</title>
		<link>http://www.alejandromoraga.com.br/introducao-a-programacao-orientada-a-objetos-e-heranca</link>
		<comments>http://www.alejandromoraga.com.br/introducao-a-programacao-orientada-a-objetos-e-heranca#comments</comments>
		<pubDate>Wed, 08 Dec 2010 20:05:13 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Orientada a objetos]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[Programação Orientada a Objetos]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=237</guid>
		<description><![CDATA[Programar orientado a objetos é muito mais que construir classes e métodos. A Wikipédia define como paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos. Resumindo: programar pensando em objetos da vida real. A linguagem de programação Java te força a [...]]]></description>
			<content:encoded><![CDATA[<p>Programar orientado a objetos é muito mais que construir classes e métodos. A Wikipédia define como  paradigma de análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos. Resumindo: programar pensando em objetos da vida real.</p>
<p>A linguagem de programação Java te força a programar em classes. Desde o primeiro contato até o último você estará programando em classe, mas nem por isso é orientado a objetos. Objetos precisam se assemelhar aos objetos da vida real. Não é preciso ter dez objetos interagindo entre sí para ser orientado a objetos. Um objeto já é o suficiente. Por exemplo, um objeto ser humano teria os atributos: <code>nome</code>, <code>altura</code>, <code>peso</code>, <code>cor</code>, <code>data de nascimento</code>, <code>estado</code> e os métodos: <code>andar</code>, <code>correr</code>, <code>saltar</code>, <code>dormir</code>. Executar o método andar ou durmir mudaria o estado do objeto.</p>
<p>Outros objetos poderiam fazer parte desse mundo e interagir. Um objeto ônibus, por exemplo, receberia objetos seres humanos variando entre: motorista e passageiros. Quando o ônibus tivesse um motorista e o número mínimo de passegeiros poderia se desclocar para outros lugares. No deslocamento haveria outros veículos e objetos, como faróis e faixas de pedestre. Cada objeto com suas limitações exercendo sua função.</p>
<ul>
<li>Atributos e propriedades são a mesma coisa.</li>
<li>bjeto é uma instância de uma classe. Classe é uma fábrica de objetos.</li>
</ul>
<h2>Pilares da programação orientada a objetos</h2>
<p>A programação orientada a objetos é fundamentada em três pilares: herança, encapsulamento e polimorfismo. Para dominar a programação orientada a objetos você terá que dominar esses três pilares.</p>
<h3>Primeiro pilar: Herança</h3>
<p>Na herança um objeto herda as propriedades e métodos de outro objeto. O objeto herdado é o objeto pai o objeto que herda é o objeto filho &#8211; relação pai e filho.</p>
<p>A herança deve ser feita com cautela. Para um objeto poder herdar outro deve haver uma forte relação entre eles. Num E-commerce temos a classe <code>Produto</code>. Essa classe poderia ter os herdeiros <code>CD de áudio</code>, <code>Filme</code>, <code>Livro</code>, <code>Roupa</code>. O que esses objetos têm em comum é que todos são produtos, podem ser adicionados no carrinho e portanto comprados. Todos tem preço, peso e dimensões. Mas cada um tem suas especialidades, senão não justificaria sua existência. O <code>CD de áudio</code> tem autor, formato, faixas. O <code>Filme</code> tem formato, áudio e legenda, duração. O <code>Livro</code> tem autor, editora, páginas.</p>
<p>Quando um objeto herda outro objeto o herdeiro passa a ter o tipo do objeto herdado. Isso significa que todos os herdeiros de uma mesma classe compartilham ao menos um tipo em comum. O método <code>adicionar produto</code> de um <code>Carrinho de compras</code> estabelece que aceita somente objetos produtos. Mas pra ele não importa se esses produtos forem <code>CD de aúdio</code> ou <code>Filme</code>. Ambos são <code>Produtos</code> porque herdaram a classe <code>Produto</code>. Essa é a importância do tipo dos objetos. Eu demorei um pouco pra entender o que isso significava e onde era utilizado.</p>
<p>Se ainda não entendeu o que é tipo, pense em um restaurante que somente aceite pessoas descendentes de sua avó. Sua mãe e você poderão entrar, mas seu pai e eu não, a menos que sejamos parentes, minha mãe seja irmã de sua mãe ou filha ou outro grau de parentesco que envolva a descendência de sua avó.</p>
<p>Onde entra o <code>Produto</code> herdar a classe de banco de dados? Não entra, não há relação nisso! Muitos programadores cometem esse erro por acharem que estão facilitando o trabalho, outros por não saberem o que a herança significa na programação. Se você cometeu esse erro, tudo bem, mas não comenta mais. Objetos na vida real herdam objetos quando há uma relação entre eles, faça o mesmo na programação.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/introducao-a-programacao-orientada-a-objetos-e-heranca/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validar CNPJ em PHP</title>
		<link>http://www.alejandromoraga.com.br/validar-cnpj-em-php</link>
		<comments>http://www.alejandromoraga.com.br/validar-cnpj-em-php#comments</comments>
		<pubDate>Tue, 07 Dec 2010 10:31:20 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CNPJ]]></category>
		<category><![CDATA[validar dados]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=235</guid>
		<description><![CDATA[Assim como o CPF, o CNPJ são números que seguem uma lógica matemática e, conhecendo essa lógica podemos construir funções para verificar se os números fornecidos são ou não CNPJ. Is_cnpj é uma função em PHP que valida CNPJ. Se a string de entrada for um CNPJ ela é retornada sem formatação (14 caracteres) ou [...]]]></description>
			<content:encoded><![CDATA[<p>Assim como o <a href="/validar-cpf-em-php">CPF</a>, o CNPJ são números que seguem uma lógica matemática e, conhecendo essa lógica podemos construir funções para verificar se os números fornecidos são ou não CNPJ.</p>
<p><code>Is_cnpj</code> é uma função em PHP que valida CNPJ. Se a string de entrada for um CNPJ ela é retornada sem formatação (14 caracteres) ou então é retornado falso.</p>
<ul>
<li>Aceita com ou sem formatação <code>xxx.xxx.xxx/xxxx-xx</code> ou <code>xxxxxxxxxxxxxxx</code></li>
<li>Variações de 14, 15, 18 ou 19 caracteres <code>xxxxxxxxxxxxxx</code> (14)<br />
<code>xxxxxxxxxxxxxxx</code> (15)<br/><br />
<code>xx.xxx.xxx/xxxx-xx</code> (18)<br/><br />
<code>xxx.xxx.xxx/xxxx-xx</code> (19)</li>
<li>Retorna o CNPJ sem formatação com 14 caracteres <code>xxxxxxxxxxxxxx</code></li>
</ul>
<pre>function is_cnpj($str) {
	if (!preg_match('|^(\d{2,3})\.?(\d{3})\.?(\d{3})\/?(\d{4})\-?(\d{2})$|', $str, $matches))
		return false;

	array_shift($matches);

	$str = implode('', $matches);
	if (strlen($str) &gt; 14)
		$str = substr($str, 1);

	$sum1 = 0;
	$sum2 = 0;
	$sum3 = 0;
	$calc1 = 5;
	$calc2 = 6;

	for ($i=0; $i &lt;= 12; $i++) {
		$calc1 = $calc1 &lt; 2 ? 9 : $calc1;
		$calc2 = $calc2 &lt; 2 ? 9 : $calc2;

		if ($i &lt;= 11)
			$sum1 += $str[$i] * $calc1;

		$sum2 += $str[$i] * $calc2;
		$sum3 += $str[$i];
		$calc1--;
		$calc2--;
	}

	$sum1 %= 11;
	$sum2 %= 11;

	return ($sum3 &amp;&amp; $str[12] == ($sum1 &lt; 2 ? 0 : 11 - $sum1) &amp;&amp; $str[13] == ($sum2 &lt; 2 ? 0 : 11 - $sum2)) ? $str : false;
}</pre>
<p>Exemplos:</p>
<pre>if (is_cnpj($cnpj)) {
	// CNPJ válido
}
else {
	// CNPJ inválido
}

// Se verdadeiro, a função retorna o CNPJ sem formatação com 14 caracteres
$cnpj = '10.530.985/0001-10';

if ($cnpj = is_cnpj($cnpj)) { // atribuição e comparação
	// CNPJ válido
	echo $cnpj; // 10530985000110
}

// Erro comum de outros algoritmos - validar cadeia de zeros
if (is_cnpj('00.000.000/0000-00')) {
	// ...
}

// CNPJ com 19 caracteres
if (is_cnpj('010.530.985/0001-10')) {
	echo 'cnpj válido';
}

// CNPJ sem formatação
if (is_cnpj(10530985000110)) {
	echo 'cnpj válido';
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/validar-cnpj-em-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cortar strings sem cortar palavras</title>
		<link>http://www.alejandromoraga.com.br/cortar-strings-sem-cortar-palavras</link>
		<comments>http://www.alejandromoraga.com.br/cortar-strings-sem-cortar-palavras#comments</comments>
		<pubDate>Mon, 06 Dec 2010 08:16:59 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[strings]]></category>
		<category><![CDATA[texto]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=231</guid>
		<description><![CDATA[Extrair parte de um texto é uma tarefa que precisa de um pouco de cuidado. Um simples substr pode acabar cortando uma palavra ao meio, dando um novo significado ao texto. Observe o exemplo abaixo: substr('Programa transforma celulares comuns em smartphone', 0, 25); &#62;&#62; Programa transforma celula De &#8220;celulares&#8221; passou a ser &#8220;celula&#8221;. A frase [...]]]></description>
			<content:encoded><![CDATA[<p>Extrair parte de um texto é uma tarefa que precisa de um pouco de cuidado. Um simples <code>substr</code> pode acabar cortando uma palavra ao meio, dando um novo significado ao texto. Observe o exemplo abaixo:</p>
<pre style="clear:left">substr('Programa transforma celulares comuns em smartphone', 0, 25);
&gt;&gt; Programa transforma celula</pre>
<p>De &#8220;celulares&#8221; passou a ser &#8220;celula&#8221;. A frase teve um novo significado.</p>
<h2>Sushiman</h2>
<pre>function truncate($str, $len, $etc='') {
	$end = array(' ', '.', ',', ';', ':', '!', '?');

	if (strlen($str) &lt;= $len)
		return $str;

	if (!in_array($str{$len - 1}, $end) &#038;&#038; !in_array($str{$len}, $end))
		while (--$len &amp;&amp; !in_array($str{$len - 1}, $end));

	return rtrim(substr($str, 0, $len)).$etc;
}</pre>
<p><code>Truncate</code> corta strings tomando cuidado para não separar palavras ao meio ou em qualquer outra parte. É muito possível que o valor retornado tenha menos caracteres que o solicidado, mas temos a certeza que nenhuma palavra será quebrada.</p>
<p><strong>Exemplos:</strong></p>
<pre>$str = 'Estrelas pequenas e com pouco brilho, conhecidas como anãs vermelhas, são muito mais comuns do que se imaginava.';
substr($str, 0, 50);
&gt;&gt; Estrelas pequenas e com pouco brilho, conhecidas co

truncate($str, 50);
&gt;&gt; Estrelas pequenas e com pouco brilho, conhecidas

truncate($str, 50, '...');
&gt;&gt; Estrelas pequenas e com pouco brilho, conhecidas...</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/cortar-strings-sem-cortar-palavras/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caçar palavras com expressão regular</title>
		<link>http://www.alejandromoraga.com.br/cacar-palavras-com-expressao-regular</link>
		<comments>http://www.alejandromoraga.com.br/cacar-palavras-com-expressao-regular#comments</comments>
		<pubDate>Fri, 03 Dec 2010 08:45:44 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Expressão Regular]]></category>
		<category><![CDATA[palavras]]></category>
		<category><![CDATA[texto]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=228</guid>
		<description><![CDATA[Palavras são conjuntos de letras minúsculas e/ou maiúsculas. ([A-Za-z]+) Parênteses delimitam um bloco que quando encontrado deve ser retornado; A-Z representa as letras maiúsculas; a-z representa as letras minúscula; e &#8220;+&#8221; indica que deve existir ao menos uma letra e pode haver outras inúmeras (uma ou mais). Vamos testar a expressão regular em algumas palavras: [...]]]></description>
			<content:encoded><![CDATA[<p>Palavras são conjuntos de letras minúsculas e/ou maiúsculas.</p>
<pre>([A-Za-z]+)</pre>
<ul style="clear:left">
<li>Parênteses delimitam um bloco que quando encontrado deve ser retornado;</li>
<li><code>A-Z</code> representa as letras maiúsculas;
<li><code>a-z</code> representa as letras minúscula; e</li>
<li>&#8220;<code>+</code>&#8221; indica que deve existir ao menos uma letra e pode haver outras inúmeras (uma ou mais).</li>
</ul>
<p>Vamos testar a expressão regular em algumas palavras:</p>
<table style="width:360px;">
<caption style="background:#5A656F; color:#FFF;">
<h4>([A-Za-z]+)</h4>
</caption>
<thead style="background:#6F777F; color:#FFF;">
<tr>
<th>Palavra</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>Casa</td>
<td>Sim</td>
</tr>
<tr>
<td>sapato</td>
<td>Sim</td>
</tr>
<tr>
<td>Ação</td>
<td>Não</td>
</tr>
<tr>
<td>Árvores</td>
<td>Não</td>
</tr>
</tbody>
</table>
<p>Como era de se esperar, funcionou para &#8220;Casa&#8221; e &#8220;sapato&#8221;. Mas não funcionou para &#8220;Ação&#8221; e &#8220;Árvores&#8221; porque <code>A-Za-z</code> não inclui diacríticos, sinais gráficos colocados sobre, sob ou através de algumas letras, como a cecedilha &#8220;ç&#8221; de &#8220;Ação&#8221; e o acento agudo no &#8220;Á&#8221; de &#8220;Árvore&#8221;.</p>
<p>É necessário acrescentar na expressão regular algo que represente essas letras &#8220;modificadas&#8221;. Não convém colocar uma a uma dentro dos colchetes porque existem várias combinações e há grande chance de esquecer algumas, sem falar no trabalho que vai dar.</p>
<h3>Expressões Regulares e Acentuação</h3>
<pre>[A-ZÀ-Úa-zà-ú]</pre>
<p>A solução mais simples e elegante é usar <code>À-Ú</code> para letras maiúsculas com acentução e <code>à-ú</code> para letras minúsculas.</p>
<p>Vamos testar nossa expressão regular modificada:</p>
<table style="width:360px;">
<caption style="background:#5A656F; color:#FFF;">
<h4>([A-ZÀ-Úa-zà-ú]+)</h4>
</caption>
<thead style="background:#6F777F; color:#FFF;">
<tr>
<th>Palavra</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>Habitação</td>
<td>Sim</td>
</tr>
<tr>
<td>àquelas</td>
<td>Sim</td>
</tr>
<tr>
<td>Guarda-chuva</td>
<td>Não</td>
</tr>
<tr>
<td>vê-las</td>
<td>Não</td>
</tr>
</tbody>
</table>
<p>Um novo problema: palavras compostas ou &#8220;palavras dentro de palavras&#8221;. Palavras ligadas por hífen. Temos, por exemplo: cabeça-dura, feijão-preto, físico-químico.</p>
<h3>Expressões Regulares e Palavras compostas</h3>
<p>O hífen não pode ser simplesmente incluído entre os colchetes pois aceitaria combinações como: &#8220;-palavra&#8221;, &#8220;palavra-&#8221; e &#8220;-palavra-&#8221;. É necessário que, caso exista hífen tenha pelo menos uma letra antes e depois.</p>
<pre>([A-ZÀ-Úa-zà-ú]+(?:-[A-ZÀ-Úa-zà-ú]+)?)</pre>
<p>O padrão para letras foi duplicado a direta e um hífen foi acrescentado no meio. Se tiver um hífen necessariamente deve existir pelo menoss uma letra a direita desse hífen. O sinal de interrogação no final da expressão, <code>(?:-[A-ZÀ-Úa-zà-ú]+)?</code>, significa que o bloco é opcional. Não queremos que a expressão encontre apenas palavras compostas.</p>
<p>O que significa <code><em>(?:</em>expressão<em>)</em></code>? Quando fazemos uso de parênteses sem escape (&#8220;\(&#8221; ou &#8220;\)&#8221;) numa expressão regular estamos dizendo que é para retornar o valor que estiver entre eles. Então, se deixarmos esses parênteses sem nenhum tratamento vamos ter resultados a mais do que o esperado: a palavra inteira e a parte com hífen. O uso de <code>?:</code> logo após o parêntese de abre evita que esse bloco seja retornado.</p>
<p>A expressão regular está boa, mas ainda não está completa. Existem palavras que possuem mais de um hífen, como: cana-de-açucar. O sinal de interrogação &#8220;?&#8221; diz que pode ter, sim ou não. Substituir o sinal de interrogação por asterisco &#8220;*&#8221; significa que poderá existir nenhum ou vários.</p>
<pre>([A-ZÀ-Úa-zà-ú]+(?:-[A-ZÀ-Úa-zà-ú]+)*)</pre>
<p>Testes:</p>
<table style="width:360px;">
<caption style="background:#5A656F; color:#FFF;">
<h4>([A-ZÀ-Úa-zà-ú]+(?:-[A-ZÀ-Úa-zà-ú]+)*)</h4>
</caption>
<thead style="background:#6F777F; color:#FFF;">
<tr>
<th>Palavra</th>
<th>Resultado</th>
</tr>
</thead>
<tbody>
<tr>
<td>Simples</td>
<td>Sim</td>
</tr>
<tr>
<td>seguro-saúde</td>
<td>Sim</td>
</tr>
<tr>
<td>cana-de-açucar</td>
<td>Sim</td>
</tr>
</tbody>
</table>
<p>Agora a expressão caça todos os tipos de palavras: simples, acentuação, cecidilha e palavras compostas. A expressão regular está quase finalizada, a não ser por um detalhe.</p>
<h3>Modificadores</h3>
<p>Use o modificador <strong>i</strong> (PCRE_CASELESS) para combinar tanto letras maiúsculas como minúsculas.</p>
<p><strong>Final</strong></p>
<pre>#([a-zà-ú]+(?:-[a-zà-ú]+)*)#i</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/cacar-palavras-com-expressao-regular/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Converter array para URL</title>
		<link>http://www.alejandromoraga.com.br/converter-array-para-url</link>
		<comments>http://www.alejandromoraga.com.br/converter-array-para-url#comments</comments>
		<pubDate>Thu, 02 Dec 2010 08:31:47 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[conversão]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=225</guid>
		<description><![CDATA[$_GET é um array (ou matriz) de variáveis passadas na URL. Por exemplo, a URL: http://exemplo.com?nome=Alejandro&#38;pais=Brasil&#38;regiao=Sudeste Tem as variáveis: print_r($_GET); array ( nome =&#62; Alejandro, pais =&#62; Brasil, regiao =&#62; Sudeste ) Acessamos esses valores usando seus índices no array $_GET. echo $_GET['pais']; // exibe Brasil echo $_GET['regiao']; // exibe Sudeste Converter array em variáveis [...]]]></description>
			<content:encoded><![CDATA[<p><code>$_GET</code> é um array (ou matriz) de variáveis passadas na URL.</p>
<p>Por exemplo, a URL:</p>
<pre>http://exemplo.com?nome=Alejandro&amp;pais=Brasil&amp;regiao=Sudeste</pre>
<p>Tem as variáveis:</p>
<pre>print_r($_GET);

array
(
	nome =&gt; Alejandro,
	pais =&gt; Brasil,
	regiao =&gt; Sudeste
)</pre>
<p>Acessamos esses valores usando seus índices no array <code>$_GET</code>.</p>
<pre>echo $_GET['pais']; // exibe Brasil
echo $_GET['regiao']; // exibe Sudeste</pre>
<h2>Converter array em variáveis de URL</h2>
<p>Não existe uma função nativa do PHP que converta array em variáveis de URL. Então vamos construir nossa função:</p>
<pre>function arrtourl($arr, $entity=true, $prefix='') {
	$params = array();
	foreach ($arr as $k =&gt; $v)
		if ($v)
			$params[] = is_array($v) ? arrtourl($v, $entity, $prefix ? $prefix.'['.$k.']' : $k) : sprintf($prefix ? $prefix.'[%s]' : '%s', urlencode($k)).'='.urlencode($v);
	return implode($entity ? '&amp;amp;' : '&amp;', $params);
}</pre>
<p><code>Arrtourl</code> faz a conversão para nós. Entre seus parâmetros, apenas os dois primeiros são importantes. O terceiro parâmetro é usado na recursão quando há matrizes.</p>
<p>O parâmetro <code>$arr</code> é o array para ser convertido e <code>$entity</code> define se as variáveis serão unidas com <code>&amp;amp;</code> ou apenas <code>&amp;</code>. Por quê? Porque na maioria das vezes vamos usar essa função para criar links dentro de páginas HTML e como <code>&amp;</code> é um caractere especial do HTML (XML), precisamos usar sua entidade para não gerar erros no documento.</p>
<h3>Exemplos:</h3>
<p><strong>Simples:</strong></p>
<pre>$arr = array(
	'id' =&gt; 968,
	'cat' =&gt; 'php'
);

echo arrtourl($arr);

&gt;&gt; id=968&amp;amp;cat=php</pre>
<p><strong>Matriz:</strong></p>
<pre>$mat = array(
	'teste' =&gt; array(
		'id' =&gt; 968,
		'cat' =&gt; php
	),
	'status' =&gt; 1,
	'seq' =&gt; array(
		1,
		2,
		3
	)
);

echo arrtourl($mat);

&gt;&gt; teste[id]=968&amp;amp;teste[cat]=php&amp;amp;status=1&amp;amp;seq[0]=1&amp;amp;seq[1]=2&amp;amp;seq[2]=3</pre>
<p><strong>Muitas dimensões:</strong></p>
<pre>$arr = array(
	'valor' =&gt; array(
		array(
			array(
				'teste'
			)
		)
	)
);

echo arrtourl($arr);

&gt;&gt; valor[0][0][0]=teste</pre>
<p><strong>Sem conversão de &amp;</strong></p>
<pre>$arr = array(
	'id' =&gt; 968,
	'cat' =&gt; 'php',
);

// id=968&amp;cat=php
$url = arrtourl($arr, false);

header('Location: pagina?'.$url);</pre>
<p><strong>Prefixo</strong></p>
<p>Você pode usar o terceiro parâmetro para embutir tudo num array.</p>
<pre>$arr = array(
	'id' =&gt; 968,
	'cat' =&gt; 'php'
);

echo arrtourl($arr, false, 'post');

&gt;&gt; post[id]=968&amp;post[cat]=php</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/converter-array-para-url/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Placeholder do HTML5 em navegadores sem suporte</title>
		<link>http://www.alejandromoraga.com.br/placeholder-do-html5-em-navegadores-sem-suporte</link>
		<comments>http://www.alejandromoraga.com.br/placeholder-do-html5-em-navegadores-sem-suporte#comments</comments>
		<pubDate>Wed, 01 Dec 2010 08:32:29 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Placeholder]]></category>
		<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=220</guid>
		<description><![CDATA[Placeholder é um novo atributo do HTML5. Sua funcionalidade é simples: adicionar um valor padrão em inputs e textareas quando o campo estiver vazio. Funciona como rótulo. &#60;input type="text" placeholder="Digite seu nome aqui!" /&#62; Alguns navegadores, como o Firefox até pelo menos a versão 3.6, não tem suporte a esse atributo. O código abaixo é [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Placeholder</strong> é um novo atributo do HTML5. Sua funcionalidade é simples: adicionar um valor padrão em inputs e textareas quando o campo estiver vazio. Funciona como rótulo.</p>
<pre>&lt;input type="text" <b>placeholder="Digite seu nome aqui!"</b> /&gt;</pre>
<p><img src="http://www.alejandromoraga.com.br/wp-content/uploads/2010/12/placeholder-example.jpg" alt="placeholder exemplo" title="Exemplo de utilização do placeholder"/></p>
<p>Alguns navegadores, como o Firefox até pelo menos a versão 3.6, não tem suporte a esse atributo.</p>
<p>O código abaixo é uma extensão (plugin) para jQuery que simula a funcionalidade do placeholder do HTML5.</p>
<pre>(function($) {
	$.fn.extend({
		placeholder: function() {
			return this.each(function() {
				$('[placeholder]', this)
					.focus(function() {
						if ($(this).val() == $(this).attr('placeholder'))
							$(this).val('').css('color', '#000');
					})
					.blur(function() {
						if (!$(this).val() || $(this).val() == $(this).attr('placeholder'))
							$(this).val(function() { return $(this).attr('placeholder') }).css('color', '#ccc');
					})
					.filter(':not([value])').val(function() { return $(this).attr('placeholder') }).css('color', '#ccc')
					.parents('form')
						.bind('submit', function() {
							$('[placeholder]', this).val(function() { return $(this).val() != $(this).attr('placeholder') ? $(this).val() : '' });
						});
			});
		}
	});
})(jQuery);</pre>
<p>Para usar é muito simples. Adicione normalmente o atributos placeholder. Feito isso, no elemento pai execute:</p>
<pre>$('pai').placeholder();</pre>
<p>E todos os elementos filhos desse elemento terão a funcionalidade placeholder, mesmo que o navegador não suporte.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/placeholder-do-html5-em-navegadores-sem-suporte/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugins para segurança do seu site</title>
		<link>http://www.alejandromoraga.com.br/plugins-para-seguranca-do-seu-site</link>
		<comments>http://www.alejandromoraga.com.br/plugins-para-seguranca-do-seu-site#comments</comments>
		<pubDate>Tue, 30 Nov 2010 08:20:00 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Exploit]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[SQL Injection]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=216</guid>
		<description><![CDATA[XSS-Me, SQL Inject-Me e Access-Me são plugins gratuitos para o Firefox da Security Compass para testar vulnerabilidades de ataques Cross-Site Scripting, SQL Injection e falhas de acesso.]]></description>
			<content:encoded><![CDATA[<p><strong>XSS-Me</strong>, <strong>SQL Inject-Me</strong> e <strong>Access-Me</strong> são plugins gratuitos para o Firefox da <a href="http://www.securitycompass.com/">Security Compass</a> para testar vulnerabilidades de ataques Cross-Site Scripting, SQL Injection e falhas de acesso.</p>
<p>Site oficial: <a href="http://labs.securitycompass.com/index.php/exploit-me/">http://labs.securitycompass.com/index.php/exploit-me/</a></p>
<p><a href="https://addons.mozilla.org/pt-BR/firefox/search/?q=exploit-me&#038;cat=all&#038;lver=any&#038;pid=1&#038;sort=&#038;pp=20&#038;lup=&#038;advanced=">Add-ons for Firefox</a></p>
<p><img src="http://www.alejandromoraga.com.br/wp-content/uploads/2010/11/exploit-me-plugins.jpg" alt="Plugins Exploit-me para Firefox" title="exploit-me"/></p>
<h2>XSS</h2>
<p>Cross-site scripting é um tipo de vulnerabilidade do sistema de segurança de um computador, encontrado normalmente em aplicações web que activam ataques maliciosos ao injectarem client-side script dentro das páginas web vistas por outros usuários. Através de um XSS, o Cracker injeta codigos JavaScript em um campo texto de uma página já existente e este JavaScript é apresentado para outros usuários.</p>
<h2>SQL Injection</h2>
<p>A Injeção de SQL, mais conhecida através do termo americano SQL Injection, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. A injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entrada de dados de uma aplicação.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/plugins-para-seguranca-do-seu-site/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remover acentuação em Python</title>
		<link>http://www.alejandromoraga.com.br/remover-acentuacao-em-python</link>
		<comments>http://www.alejandromoraga.com.br/remover-acentuacao-em-python#comments</comments>
		<pubDate>Mon, 29 Nov 2010 10:09:19 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[acentuação]]></category>

		<guid isPermaLink="false">http://www.alejandromoraga.com.br/?p=212</guid>
		<description><![CDATA[O código remove a acentuação das letras substituindo por caracteres simples. De ã para a, ç para c. def rem_acentuacao(str): from unicodedata import normalize return normalize('NFKD', str.decode('utf-8')).encode('ASCII', 'ignore') Exemplos: &#62;&#62;&#62; rem_acentuacao('não faça') nao faca]]></description>
			<content:encoded><![CDATA[<p>O código remove a acentuação das letras substituindo por caracteres simples. De <strong>ã</strong> para <strong>a</strong>, <strong>ç</strong> para <strong>c</strong>.</p>
<pre>def rem_acentuacao(str):
	from unicodedata import normalize
	return normalize('NFKD', str.decode('utf-8')).encode('ASCII', 'ignore')</pre>
<p>Exemplos:</p>
<pre>&gt;&gt;&gt; rem_acentuacao('não faça')
nao faca</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alejandromoraga.com.br/remover-acentuacao-em-python/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

