<?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>Jarbs</title>
	<atom:link href="http://www.jarbs.com.br/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jarbs.com.br</link>
	<description>Programação, PHP, Javascript, HTML, CSS, Python</description>
	<lastBuildDate>Thu, 02 Sep 2010 21:17:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Converter array para objetos específicos em PHP</title>
		<link>http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html</link>
		<comments>http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html#comments</comments>
		<pubDate>Thu, 02 Sep 2010 21:03:34 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Array]]></category>
		<category><![CDATA[cast]]></category>
		<category><![CDATA[conversão]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[tipos]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=597</guid>
		<description><![CDATA[A conversão de tipos por Cast do PHP é limitada quando falamos de objetos. Para gerar objetos específicos vamos precisar mais que a conversão de tipos do PHP.]]></description>
			<content:encoded><![CDATA[<p>Temos o array:</p>
<pre>$arr = array('nome' => 'Joãozinho', 'idade' => 7);</pre>
<p>E queremos converter para objeto:</p>
<pre>$obj = (object) $arr;</pre>
<p>Agora <code>$obj</code> é um objeto. Esse método de conversão que usamos se chama Cast, conversão de tipos.</p>
<p>Atalho:</p>
<pre>$obj = (object) array('nome' => 'Joãozinho', 'idade' => 7);</pre>
<p>Mas este é um objeto simples, é um objeto sem tipo. Não possui métodos porque não faz parte de uma classe.</p>
<p>Para converter os arrays em objetos mais específicos, pertencentes a uma classe vamos precisar mais que o Cast. A conversão de tipos do PHP não suporta outros tipos a não ser:</p>
<ul>
<li>(int), (integer) &#8211; molde para inteiro</li>
<li>(bool), (boolean) &#8211; converte para booleano</li>
<li>(float), (double), (real) &#8211; converte para número de ponto flutuante</li>
<li>(string) &#8211; converte para string</li>
<li>(binary) &#8211; converte para string binária (PHP 6)</li>
<li>(array) &#8211; converte para array</li>
<li>(object) &#8211; converte para objeto</li>
<li>(unset) &#8211; converte para NULL (PHP 5)</li>
</ul>
<p>Então <b>não</b> podemos usar:</p>
<pre>$obj = (MinhaClasse) array('nome' => 'Joãozinho', 'idade' => 7);</pre>
<h2>A diversão</h2>
<p>Vou colocar primeiro código e depois explicar.</p>
<pre>function cast($data, $class_name, $construct=true) {
	$obj = unserialize('O:'. strlen($class_name) .':"'. $class_name .'"'. substr(serialize($data), 1));
	if ($construct &#038;&#038; method_exists($obj, '__construct'))
		$obj->__construct();
	return $obj;
}</pre>
<p>A função cast recebe três parâmetros:</p>
<ul>
<li>$data &#8211; o array a ser convertido</li>
<li>$class_name &#8211; o nome da classe que o novo objeto deve assumir</li>
<li>$constructor &#8211; se iniciamos o objeto da maneira tradicional executando o contrutor</li>
</ul>
<p>O processo da função é:</p>
<ol>
<li>Serializar o array</li>
<li>Enganar a string serializada substituindo o que indica que é um array pelo nome da classe</li>
<li>Fazer o processo inverso convertendo a string serializada de volta em um valor PHP</li>
<li>Verificar se é para executar o método construtor e se ele existe, então executar</li>
<li>Retornar objeto</li>
</ol>
<p>Quando serializamos algo estamos criando uma representação que pode ser armazenada. Para poder ser armazenada precisa necessariamente ser uma string. Essa string, ou conjunto de caracteres precisa ter indicativos que digam o que ela foi no passado para no futuro quando convertida novamente poder ser a mesma coisa que já foi.</p>
<p>A função cast age na &#8220;genética&#8221; do objeto, altera suas propriedades dizendo que ele era o que nunca foi.</p>
<pre>serialização:
serialize(array('nome' => 'Joãozinho', 'idade' => 7));

resultado:
<b>a</b>:2:{s:4:"nome";s:9:"Joãozinho";s:5:"idade";i:7;}

conversão:
<b>O:11:"MinhaClasse"</b>:2:{s:4:"nome";s:9:"Joãozinho";s:5:"idade";i:7;}</pre>
<p>O construtor (__constructor) é um método como um outro. A diferença é que quando o objeto é instanciado pela forma convencional o interpretador verifica se esse método existe e então o executa. Mas nada te impede de executar ele denovo, e denovo e denovo.</p>
<p>Quando o construtor é executado o objeto já tem suas propriedades, então se o nosso construtor for:</p>
<pre>function __constructor() {
	echo $this-&gt;nome;
}</pre>
<p>Não duvide que vai aparecer &#8220;Joãozinho&#8221;.</p>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html" rel="bookmark" class="crp_title">Valor monetário (float) a todo custo</a></li><li><a href="http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html" rel="bookmark" class="crp_title">Mergulhando no CSS &#8211; Parte 1</a></li><li><a href="http://www.jarbs.com.br/unindo-e-definindo-novos-atributos-em-objetos,393.html" rel="bookmark" class="crp_title">Unindo e definindo novos atributos em objetos</a></li><li><a href="http://www.jarbs.com.br/como-usar-nodename-e-outras-propriedades-e-metodos-dom-em-jquery,398.html" rel="bookmark" class="crp_title">Como usar nodeName e outras propriedades e métodos DOM em jQuery?</a></li><li><a href="http://www.jarbs.com.br/introducao-a-programacao-orientada-a-objetos-e-a-heranca,535.html" rel="bookmark" class="crp_title">Introdução a programação orientada a objetos e herança</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mergulhando no CSS &#8211; Parte 1</title>
		<link>http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html</link>
		<comments>http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html#comments</comments>
		<pubDate>Wed, 01 Sep 2010 20:11:38 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=589</guid>
		<description><![CDATA[Cascating Style Sheet, folha de estilo em cascata onde as regras definidas mais abaixo sobrescrevem as mais acima. Conheça como era antes e pós CSS.]]></description>
			<content:encoded><![CDATA[<p>Cascating Style Sheet, folha de estilo em cascata, ou simplesmente códigos onde as regras definidas mais abaixo sobrescrevem as regras mais acima.</p>
<p>Antes do CSS era muito complicado e trabalhoso definir e modificar os estilos, como fonte, tamanhos, bordas, cores, etc. </p>
<p>Vejamos dois parágrafos:</p>
<pre>&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;</pre>
<p>Para definir a fonte Arial e tamanho de mais ou menos 12px nesses dois parágrafos sem CSS precisamos colocar logo no começado de cada parágrafo uma tag &lt;font&gt; com essas propriedades ficando:</p>
<pre>&lt;p&gt;&lt;font face="Arial" size="3">texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3">texto texto&lt;/font&gt;&lt;/p&gt;</pre>
<p>Então se tivermos 10 parágrafos cada um precisa ter a tag &lt;font&gt;!</p>
<pre>&lt;p&gt;&lt;font face="Arial" size="3">texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial" size="3"&gt;texto texto&lt;/font&gt;&lt;/p&gt;</pre>
<p>É um tremendo gasto de dedo, paciência e tempo ficar inserindo &lt;font&gt; em cada elemento.</p>
<p>Os sites geralmente tem de 6 a milhares de páginas. Vamos pensar em um site com 20 páginas. Em todos os parágrafos dessas 20 páginas definimos a fonte Arial e com o tamanho 3. Imagine que você precise mudar todos esses parágrafos para fonte Verdana. Lá se vai horas disperdiçadas a toa! Isso porque a nossa imaginação limitou-se apenas em mudar o tipo da fonte, mas poderia ser algo mais complicado e maior.</p>
<p>&lt;font face=&#8221;" color=&#8221;" size=&#8221;"&gt;</p>
<p>Um outro grande problema é o quanto é limitado interagir na aparência de um site só com esses recursos. É impossível criar esses sites que vemos por ai sem CSS.</p>
<p>Ficar usando todas essas &lt;font&gt; e outras lambanças de HTML tem um peso. Um peso bem pesado para o tráfego de rede do servidor. Acessar um site é como ir no mercado, as compras fazem peso na hora de carregá-las de volta pra casa.</p>
<p>Digamos que cada caractere equivale a 1 byte. Então &lt;font face=&#8221;Arial&#8221; size=&#8221;3&#8243;>&lt;/font&gt; são 35 bytes. Um página com um monte de parágrafos são um monte de 35 bytes a mais. Sites leves são bons para os visitantes e também para os responsáveis. Um site leve carrega mais rápido e quanto menor torna-se mais independente de conexões rápidas. Um site leve ocupa menos espaço, menos espaço gasto com backups, menos tráfego de rede, menos processamento do servidor e por ai vai.</p>
<p>Deus salve o inventor do CSS que nos tornou possível aproveitar melhor os dias e reduziu nosso trabalho. O que eu sempre digo é que o ser humano foi feito pra pensar, criar coisas inteligentes, fazer ferramentas pra facilitar nosso trabalho e não ficar fazendo trabalhos cansativos e repetitivos.</p>
<p>O CSS em sua grandeza nos permite separar o estilo da estrutura. CSS em um lugar, HTML em outro. Não precisamos misturar HTML com estilo, podemos deixar tudo separado. Esqueça de uma vez a tag &lt;font&gt;.</p>
<h3>Como o CSS funciona?</h3>
<p>O CSS pode ser definido num documento HTML dentro da tag<br />
<style type="text/css"></style>
<p> ou em arquivos separados.</p>
<p>Em geral, a visão do css é:</p>
<pre>elemento {
	atributos
}</pre>
<p>Exemplo:</p>
<pre>alejandro {
	tamanho: 1,81m,
	largura: 90cm,
	peso: 94kg
}</pre>
<p>Tudo que estiver entre as chaves são definições de estilo do elemento a esquerda da primeira chave.</p>
<p>Podemos ter vários elementos:</p>
<pre>predio {
	andares: 9,
	idade: 40anos
}

carro {
	quilometragem: 0,
	cor: preto,
	rodas: 4
}</pre>
<p>Os elementos tem atributos iguais e exclusivos. O color pode estar em parágrafos, links e tabelas, mas por exemplo, o atributo border-spacing é exclusivo para tabelas. Na maioria dos casos um atributo vale para vários elementos. É bem menor o número de atributos específicios.</p>
<p>No exemplo bem acima dos parágrafos, podemos resolver o problema de definição de fonte e tamanho com uma única linha sem &#8220;sujar&#8221; o HTML.</p>
<p>O parágrafos permanecem &#8220;limpos&#8221;, não há nenhum tag ou atributo definindo estilo:</p>
<pre>&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;</pre>
<p>O CSS é:</p>
<pre>p {
	font:12px Arial;
}</pre>
<p>Eu disse em uma única linha porque podemos deixar:</p>
<pre>p {font:12px Arial;}</pre>
<p>E se tiver que mudar a fonte dos parágrafos mude apenas ali.</p>
<pre>p {
	font:12px <b>Verdana</b>;
}</pre>
<p>O que demoraria horas fazemos em segundos com CSS.</p>
<p>Não se preocupe em saber todos os atributos do CSS. Saiba apenas como funciona, o resto vem com o tempo e experiencia. Quando tiver que aplicar qualquer estilo e não souber como procure no Google como fazer. Pesquise sempre. E assim aos poucos o seu vocabulário CSS vai ir aumentando.</p>
<p>Faça o teste do exemplo acima:</p>
<pre>
&lt;html&gt;
&lt;head&gt;
&lt;style type="text/css"&gt;
p {
	font:12px Arial;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;p&gt;texto texto&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Como eu havia dito e como o próprio nome diz, folhas de estilo em cascata, as regras definidas mais abaixo sobrescrevem as regras mais acima. Se você tiver:</p>
<pre>p {
	font:12px Arial;
}

p {
	font:bold 14px Verdana;
}</pre>
<p>Os parágrafos serão de fonte Verdana, 14 pixels e em negrito. A segunda regra está mais abaixo e sobrescreve a primeira. Mas não é sobrescrita do bloco e sim das propriedades, então definir o CSS do mesmo elemento várias vezes sem repetir complementa as regras acima.</p>
<pre>p {
	font:12px Arial;
}

p {
	color: #00F;
}

p {
	text-decoration: underline;
}</pre>
<p>No final teremos parágrafos de fonte Arial com 12 pixels, cor vermelha e com sublinhado. As regras se complementaram.</p>
<h3>Hierarquia do CSS</h3>
<p>O CSS segue hierarquia, assim como o HTML, afinal ele reflete os elementos HTML.</p>
<p>Pra entendermos isso melhor vamos pensar em duas situações: link sozinhos e links que ficam dentro de parágrafos:</p>
<pre>&lt;html&gt;
&lt;body&gt;

&lt;a href="#"&gt;Link fora de parágrafo&lt;/a&gt;

&lt;p&gt;Link &lt;a href="#"&gt;Dentro de parágrafo!&lt;/a&gt;&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Ao definir:</p>
<pre>a {
	color:#00F;
}</pre>
<p>Estamos dizendo que todos os links da página são de cor azul.</p>
<p>E ao definir:</p>
<pre>p a {
	background:#EEE;
}</pre>
<p>Estamos dizendo que todos os links que estiverem dentro de parágrafos tem fundo cinza claro.</p>
<p>Assim podemos construir CSS estilos com muitos mais delalhes sem dificuldade nenhuma.</p>
<p>No próximo artigo vou falar sobre o atributo class e nas diferentes formas de você incluir CSS nas suas páginas HTML.</p>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/tag-cloud-em-php,171.html" rel="bookmark" class="crp_title">Tag Cloud em PHP</a></li><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li><li><a href="http://www.jarbs.com.br/strip-tags-em-python,121.html" rel="bookmark" class="crp_title">Strip tags em Python</a></li><li><a href="http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html" rel="bookmark" class="crp_title">Valor monetário (float) a todo custo</a></li><li><a href="http://www.jarbs.com.br/galerias-slide-de-imagens-em-javascript,291.html" rel="bookmark" class="crp_title">Galerias &#8211; slide de imagens em Javascript</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valor monetário (float) a todo custo</title>
		<link>http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html</link>
		<comments>http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html#comments</comments>
		<pubDate>Fri, 06 Aug 2010 19:50:10 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=564</guid>
		<description><![CDATA[Valor monetário a todo custo é porque a função abaixo vai extrair de uma string e retornar os números com ponto flutuante (com precisão de duas casas decimais) de qualquer maneira, se a string tiver números é claro. function monetary($str) { $str = preg_split('#(?:\.&#124;,)(\d{2})$#', $str, -1, PREG_SPLIT_DELIM_CAPTURE); return preg_replace('#[^0-9]#', '', $str[0]) . (!empty($str[1]) ? '.' [...]]]></description>
			<content:encoded><![CDATA[<p>Valor monetário a todo custo é porque a função abaixo vai extrair de uma string e retornar os números com ponto flutuante (com precisão de duas casas decimais) de qualquer maneira, se a string tiver números é claro.</p>
<pre>function monetary($str) {
	$str = preg_split('#(?:\.|,)(\d{2})$#', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
	return preg_replace('#[^0-9]#', '', $str[0]) . (!empty($str[1]) ? '.' . $str[1] : '');
}</pre>
<p><strong>Exemplos:</strong></p>
<pre>
monetary('10 550,25');
<em>//10550.25</em>

monetary('23.250 469.23');
<em>23250469.23</em>

monetary('23.250.469,23');
<em>23250469.23</em>

monetary('4,75');
<em>4.75</em>
</pre>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li><li><a href="http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html" rel="bookmark" class="crp_title">Mergulhando no CSS &#8211; Parte 1</a></li><li><a href="http://www.jarbs.com.br/rand-javascript,39.html" rel="bookmark" class="crp_title">Rand Javascript</a></li><li><a href="http://www.jarbs.com.br/como-remover-linhas-e-espacos-em-branco-em-php,87.html" rel="bookmark" class="crp_title">Como remover linhas e espaços em branco em PHP</a></li><li><a href="http://www.jarbs.com.br/sequencias-aleatorias-com-nivel-de-complexidade,540.html" rel="bookmark" class="crp_title">Sequências aleatórias com nível de complexidade</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validar números de agências e contas correntes do Banco do Brasil</title>
		<link>http://www.jarbs.com.br/validar-numeros-de-agencias-e-contas-correntes-do-banco-do-brasil,558.html</link>
		<comments>http://www.jarbs.com.br/validar-numeros-de-agencias-e-contas-correntes-do-banco-do-brasil,558.html#comments</comments>
		<pubDate>Thu, 05 Aug 2010 19:28:42 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=558</guid>
		<description><![CDATA[Outro dia precisei validar números de agências e contas do Banco do Brasil. Para quem precisar segue as implementações em Javascript e PHP. As regras do jogo estão logo abaixo. Javascript function numBB(n, d) { for (var i=0, a=9, n = n.toString().split('').reverse(), s = 0; i &#60; n.length; i++, a--) s += parseInt(n[i]) * a; [...]]]></description>
			<content:encoded><![CDATA[<p>Outro dia precisei validar números de agências e contas do Banco do Brasil. Para quem precisar segue as implementações em Javascript e PHP. As regras do jogo estão logo abaixo.</p>
<h4>Javascript</h4>
<pre>function numBB(n, d) {
	for (var i=0, a=9, n = n.toString().split('').reverse(), s = 0; i &lt; n.length; i++, a--)
		s += parseInt(n[i]) * a;

	if ((s %= 11) == 10)
		s = 'x';
	else if (s &gt; 10)
		s = 0;

	return s == d.toString().toLowerCase();
}</pre>
<h4>PHP</h4>
<pre>function numBB($n, $d) {
	for ($n = (string) $n, $i=strlen($n), $a=9, $s=0; $i; $i--, $a--)
		$s += $n{$i-1} * $a;
	if (($s %= 11) == 10)
		$s = 'x';
	else if ($s &gt; 10)
		$s = 0;

	return strcasecmp($s, $d) === 0 ? true : false;
}</pre>
<h4>Regras</h4>
<p>Metodologia para cálculo do DÍGITO VERIFICADOR – DV de agência e conta corrente
<p>   a) Cada algarismo que compõe o número é multiplicado pelo respectivo multiplicador (peso).
<p>       I &#8211; Os multiplicadores (pesos) variam de 9 a 2, da direita para a esquerda;
<p>       II &#8211; O primeiro dígito da direita para a esquerda deverá ser multiplicado por 9, o segundo por 8 e assim
<p>sucessivamente;                                      </p>
<p>    b) Os resultados das multiplicacoes são somados;
<p>    c) O total da soma é dívido por onze;
<p>       I &#8211; se o resto for menor que 10 (dez) o DV será igual ao resto;
<p>       II &#8211; se o resto for igual a 10 /dez/ o DV sera igual a X;
<p>       III &#8211; se o resto for igual a 0 /zero/ o DV sera igual a 0;
<p>       IV &#8211; no exemplo acima o digito verificador sera igual a 3;
<p>    e) Exemplo:               </p>
<pre>

    0    1    1    2    9    0    0    4    5    9    0
    X    X    X    X    X    X    X    X    X    X    X
    7    8    9    2    3    4    5    6    7    8    9              

    .    .    .    .    .    .    .    .    .    ....00
    .    .    .    .    .    .    .   ..........72
    .    .    .    .    .    .    .  ......35
    .    .    .    .    .    .  ......24
    .    .    .    .    .........00
    .    .    .    .    ....00
    .    .    .   .....27
    .    .   .....04
    .  .....09
    ...08
..00
    Total...................................................179</pre>
<p>a) Soma do resultado das multiplicações: 00 + 72 + 35 +8 + 0 = 179
<p>b) Divisão do resultado da soma das multiplicações por 11: 179/11
<p>c) Resto da divisão igual a 3:
<p>d) Dígito Verificador = 3 (três)
<p>Exemplos:</p>
<pre>
  AGE        CONTA
6510-2     003655-2
6507-2     024601-8
7009-2     022810-9
6746-6     006373-8
6605-2     461462-3
6845-4     100140-X</pre>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html" rel="bookmark" class="crp_title">Valor monetário (float) a todo custo</a></li><li><a href="http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html" rel="bookmark" class="crp_title">Mergulhando no CSS &#8211; Parte 1</a></li><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li><li><a href="http://www.jarbs.com.br/expressoes-regulares-padroes-comuns,282.html" rel="bookmark" class="crp_title">Expressões Regulares &#8211; Padrões comuns</a></li><li><a href="http://www.jarbs.com.br/letras-em-caracteres-e-strings,269.html" rel="bookmark" class="crp_title">Letras em caracteres e strings</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/validar-numeros-de-agencias-e-contas-correntes-do-banco-do-brasil,558.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Guia de Expressões Regulares Compatíveis com Perl &#8211; PCRE</title>
		<link>http://www.jarbs.com.br/guia-de-expressoes-regulares-compativeis-com-perl-pcre,543.html</link>
		<comments>http://www.jarbs.com.br/guia-de-expressoes-regulares-compativeis-com-perl-pcre,543.html#comments</comments>
		<pubDate>Fri, 21 May 2010 16:54:32 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Expressão Regular]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Guia]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=543</guid>
		<description><![CDATA[Guia PHP PCRE com funções, meta caracteres, modificadores do padrão, classes de caracteres base, quantificadores e subpadrões]]></description>
			<content:encoded><![CDATA[<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Funções</strong></em></p>
<tbody>
<tr>
<td><a href="http://br2.php.net/manual/pt_BR/function.preg-match.php">preg_match</a>(pattern, subject[, submatches])</td>
</tr>
<tr>
<td><a href="http://br2.php.net/manual/pt_BR/function.preg-match-all.php">preg_match_all</a>(pattern, subject[, submatches])</td>
</tr>
<tr>
<td><a href="http://br2.php.net/manual/pt_BR/function.preg-replace.php">preg_replace</a>(pattern, replacement, subject)</td>
</tr>
<tr>
<td><a href="http://br2.php.net/manual/pt_BR/function.preg-replace-callback.php">preg_replace_callback</a>(pattern, callback, subject)</td>
</tr>
<tr>
<td><a href="http://br2.php.net/manual/pt_BR/function.preg-grep.php">preg_grep</a>(pattern, array)</td>
</tr>
<tr>
<td><a href="http://br2.php.net/manual/pt_BR/function.preg-split.php">preg_split</a>(pattern, subject)</td>
</tr>
</tbody>
</table>
<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Meta Characteres</strong></em></p>
<tbody>
<tr>
<td width="50">^</td>
<td>Start of subject (or line in multiline mode)</td>
</tr>
<tr>
<td width="50">$</td>
<td>End of subject (or line in multiline mode)</td>
</tr>
<tr>
<td width="50">[</td>
<td>Start character class definition</td>
</tr>
<tr>
<td width="50">]</td>
<td>End character class definition</td>
</tr>
<tr>
<td width="50">|</td>
<td>Alternates, eg (a|b) matches a or b</td>
</tr>
<tr>
<td width="50">(</td>
<td>Start pattern</td>
</tr>
<tr>
<td width="50">)</td>
<td>End subpattern</td>
</tr>
<tr>
<td width="50">\</td>
<td>Escape character</td>
</tr>
</tbody>
</table>
<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Pattern Modifiers</strong></em></p>
<tbody>
<tr>
<td width="50">i</td>
<td>Caseless &#8211; ignore case</td>
</tr>
<tr>
<td width="50">m</td>
<td>Multiline mode &#8211; ^ and $ match start and end of lines</td>
</tr>
<tr>
<td width="50">s</td>
<td>Dotall &#8211; . class includes newline</td>
</tr>
<tr>
<td width="50">x</td>
<td>Extended &#8211; comments &amp; whitespace</td>
</tr>
<tr>
<td width="50">e</td>
<td>preg_replace only &#8211; enables evaluation of replacement as PHP code</td>
</tr>
<tr>
<td width="50">S</td>
<td>Extra analysis of pattern</td>
</tr>
<tr>
<td width="50">U</td>
<td>Pattern is ungreedy</td>
</tr>
<tr>
<td width="50">u</td>
<td>Pattern is treated as UTF-8</td>
</tr>
</tbody>
</table>
<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Base Character Classes</strong></em></p>
<tbody>
<tr>
<td width="50">\w</td>
<td>Any &#8220;word&#8221; character (a-z 0-9 _)</td>
</tr>
<tr>
<td width="50">\W</td>
<td>Any non &#8220;word&#8221; character</td>
</tr>
<tr>
<td width="50">\s</td>
<td>Whitespace (space, tab CRLF)</td>
</tr>
<tr>
<td width="50">\S</td>
<td>Any non whitespace character</td>
</tr>
<tr>
<td width="50">\d</td>
<td>Digits (0-9)</td>
</tr>
<tr>
<td width="50">\D</td>
<td>Any non digit character</td>
</tr>
<tr>
<td width="50">.</td>
<td>(Period) &#8211; Any character except newline</td>
</tr>
</tbody>
</table>
<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Quantifiers</strong></em></p>
<tbody>
<tr>
<td width="50">n*</td>
<td>Zero or more of n</td>
</tr>
<tr>
<td width="50">n+</td>
<td>One or more of n</td>
</tr>
<tr>
<td width="50">n?</td>
<td>Zero or one occurrences of n</td>
</tr>
<tr>
<td width="50">{n}</td>
<td>n occurrences exactly</td>
</tr>
<tr>
<td width="50">{n,}</td>
<td>At least n occurrences</td>
</tr>
<tr>
<td width="50">{,m}</td>
<td>At most m occurrences</td>
</tr>
<tr>
<td width="50">{n,m}</td>
<td>Between n and m occurrences (inclusive)</td>
</tr>
</tbody>
</table>
<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Point based assertions</strong></em></p>
<tbody>
<tr>
<td width="50">\b</td>
<td>Word boundary</td>
</tr>
<tr>
<td width="50">\B</td>
<td>Not a word boundary</td>
</tr>
<tr>
<td width="50">\A</td>
<td>Start of subject</td>
</tr>
<tr>
<td width="50">\Z</td>
<td>End of subject or newline at end</td>
</tr>
<tr>
<td width="50">\z</td>
<td>End of subject</td>
</tr>
<tr>
<td width="50">\G</td>
<td>First matching position in subject</td>
</tr>
</tbody>
</table>
<table width="99%" cellspacing="0" style="margin-bottom:20px;">
<caption style="background:#777BB4; color:#FFF; padding-left:4px; text-align:left;"><em><strong>Subpattern Modifiers &amp; Assertions</strong></em></p>
<tbody>
<tr>
<td width="50">(?:)</td>
<td>Non capturing subpattern</td>
<td>((?:foo|fu)bar) matches foobar or fubar without foo or fu appearing as a captured subpattern</td>
</tr>
<tr>
<td width="50">(?=)</td>
<td>Positive look ahead assertion</td>
<td>foo(?=bar) matches foo when followed by bar</td>
</tr>
<tr>
<td width="50">(?!)</td>
<td>Negative look ahead assertion</td>
<td>foo(?!bar) matches foo when <em>not</em> followed by bar</td>
</tr>
<tr>
<td width="50">(?&lt;=)</td>
<td>Positiove look behind assertion</td>
<td>(?&lt;=foo)bar matches bar when proceded by foo</td>
</tr>
<tr>
<td width="50">(?&lt;!)</td>
<td>Negative look behind</td>
<td>(?&lt;!foo)bar matches bar when <em>not</em> proceded by foo</td>
</tr>
<tr>
<td width="50">(?&gt;)</td>
<td>Once-only subpatterns</td>
<td>(?&gt;d+)bar Performance enhacing when bar not present</td>
</tr>
<tr>
<td width="50">(?(x))</td>
<td>Condition subpatterns</td>
<td>(?(3)foo|fu)bar Matches foo if 3<sup>rd</sup> subpattern has matches, fu if not</td>
</tr>
<tr>
<td width="50">(?#)</td>
<td>Comment</td>
<td>(?# Pattern does x y or z)</td>
</tr>
</tbody>
</table>
<h3>Referências</h3>
<ul>
<li>PHP: Descreve possíveis modificadores no padrão regex &#8211; Manual. Disponível em: <a href="http://br2.php.net/manual/pt_BR/reference.pcre.pattern.modifiers.php">http://br2.php.net/manual/pt_BR/reference.pcre.pattern.modifiers.php</a></li>
</ul>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/galerias-slide-de-imagens-em-javascript,291.html" rel="bookmark" class="crp_title">Galerias &#8211; slide de imagens em Javascript</a></li><li><a href="http://www.jarbs.com.br/expressoes-regulares-padroes-comuns,282.html" rel="bookmark" class="crp_title">Expressões Regulares &#8211; Padrões comuns</a></li><li><a href="http://www.jarbs.com.br/formatar-e-instanciar-datas-no-javascript,181.html" rel="bookmark" class="crp_title">Formatar e instanciar datas no Javascript</a></li><li><a href="http://www.jarbs.com.br/cacando-e-encontrando-palavras-com-expressoes-regulares,428.html" rel="bookmark" class="crp_title">Caçando e encontrando palavras com expressões regulares</a></li><li><a href="http://www.jarbs.com.br/class-math-do-javascript,158.html" rel="bookmark" class="crp_title">Class Math do Javascript</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/guia-de-expressoes-regulares-compativeis-com-perl-pcre,543.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequências aleatórias com nível de complexidade</title>
		<link>http://www.jarbs.com.br/sequencias-aleatorias-com-nivel-de-complexidade,540.html</link>
		<comments>http://www.jarbs.com.br/sequencias-aleatorias-com-nivel-de-complexidade,540.html#comments</comments>
		<pubDate>Thu, 20 May 2010 18:08:02 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[aleatório]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=540</guid>
		<description><![CDATA[Sequências de caracteres aleatórios são úteis para muitos propósitos. Existem funções pré-prontas, como a rand do PHP que geram números aleatórios, mas por que não aprimorar este recurso e gerar sequências aleatórias mais complexas, misturando números, letras minúsculas, letras maiúsculas e caracteres especiais como &#8220;$&#8221;, &#8220;%&#8221;, &#8220;&#124;&#8221;? Dependendo da aplicação e do nível de segurança [...]]]></description>
			<content:encoded><![CDATA[<p>Sequências de caracteres aleatórios são úteis para muitos propósitos. Existem funções pré-prontas, como a rand do PHP que geram números aleatórios, mas por que não aprimorar este recurso e gerar sequências aleatórias mais complexas, misturando números, letras minúsculas, letras maiúsculas e caracteres especiais como &#8220;$&#8221;, &#8220;%&#8221;, &#8220;|&#8221;? Dependendo da aplicação e do nível de segurança você pode querer gerar apenas números ou então algo mais complexo. Pensando nisso e também em resolver os meus problemas construí uma função para gerar sequências aleatórias onde podemos definir a quantidade de caracteres e o mais importante, o nível de complexidade da sequência.</p>
<p>Por que apenas números não são o suficiente? É grande a chance de um usuário adivinhar a senha de outro usuário em um sistema onde as senhas geradas são numéricas de 5 dígitos.</p>
<p><u>Exemplos:</u></p>
<pre># números e letras minúsculas e maiúsculas, 10 caracteres
randstr();
<em>//KfRNWnST2X</em>

# números e letras minúsculas e maiúsculas, 20 caracteres
randstr(20);
<em>// uP8HmZVzHlAGwetDMuPu</em>

# números, 5 caracteres
randstr(5, 1);
<em>// 41626</em>

# números e letras minúsculas, 12 caracteres
randstr(12, 2);
<em>// 0dlae5sk70q9</em>

# números, letras minúsculas e maiúsculas e caracteres especias, 10 caracteres
randstr(10, 4);
<em>// D&gt;2)GY1WW@</em></pre>
<p><strong>Código fonte comentado</strong></p>
<p>A função foi implementada em PHP, mas você pode facilmente adaptá-la para outra linguagem.</p>
<pre>function randstr($len=10, $level=3) {
	# une os elementos do array formando uma string
	$c = implode(
			# extrai uma parte do array
			array_slice(
				array(
					'1234567890', # level 1
					'abcdefghijklmnopqrstuvwxyz', # level 2
					'ABCDEFGHIJKLMNOPQRSTUVWXYZ', # level 3
					'!@$%*()[]{}&lt;&gt;,-_=+|' # level 3
				), 0, $level));

	# total de caracteres - 1,
	# máximo valor para a escolha aleatória de caracteres
	$l = strlen($c) - 1;

	# armazena os caracteres escolhidos
	$s = '';

	# sorteia caracteres até que o valor de $len seja 0
	for (; $len; $len--, $s .= $c{rand(0, $l)});

	# retorna os caracteres aleatórios
	return $s;
}</pre>
<p>Nos caracteres especiais não inclui &#8220;?&#8221;, &#8220;&amp;&#8221; e &#8220;#&#8221; para evitar o risco dos navegador e interpretadores acabarem confundindo esses caracteres com funcionalidades. Na prática, &#8220;?&#8221; separa o endereço das variáveis, &#8220;&amp;&#8221; separa as variáveis e &#8220;#&#8221; indica ponteiros. Se você não for usar os caracteres aleatórios na transição de informações entre o cliente e navegador e quiser utilizá-los, inclua-os no quarto item do array.</p>
<p>Crie ou exclua níveis alterando os elementos do array de caracteres. Um novo elemento é um nível a mais.</p>
<p><strong>Código fonte</strong></p>
<pre>/**
 * Gera strings aleatórias
 *
 * @author Alejandro Fernandez Moraga &lt;moraga86@gmail.com&gt;
 * @param int $len Quantidade de caracteres aleatórios
 * @param int $level Nível de dificuldade da string
 * @return string
 */
function randstr($len=10, $level=3) {
	$c = implode(
			array_slice(
				array(
					'1234567890',
					'abcdefghijklmnopqrstuvwxyz',
					'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
					'!@$%*()[]{}&lt;&gt;,-_=+|'
				), 0, $level));

	$l = strlen($c) - 1;
	$s = '';

	for (; $len; $len--, $s .= $c{rand(0, $l)});

	return $s;
}</pre>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/rand-javascript,39.html" rel="bookmark" class="crp_title">Rand Javascript</a></li><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li><li><a href="http://www.jarbs.com.br/gerando-combinacoes-dos-itens-de-arrays-em-php,437.html" rel="bookmark" class="crp_title">Gerando combinações dos itens de arrays em PHP</a></li><li><a href="http://www.jarbs.com.br/urls-amigaveis-em-php,68.html" rel="bookmark" class="crp_title">URLs amigáveis em PHP</a></li><li><a href="http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html" rel="bookmark" class="crp_title">Valor monetário (float) a todo custo</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/sequencias-aleatorias-com-nivel-de-complexidade,540.html/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.jarbs.com.br/introducao-a-programacao-orientada-a-objetos-e-a-heranca,535.html</link>
		<comments>http://www.jarbs.com.br/introducao-a-programacao-orientada-a-objetos-e-a-heranca,535.html#comments</comments>
		<pubDate>Tue, 18 May 2010 21:38:46 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Programação orientada a objetos]]></category>
		<category><![CDATA[encapsulamento]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[polimorfismo]]></category>
		<category><![CDATA[POO]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=535</guid>
		<description><![CDATA[Programar orientado a objetos é muito mais que construir classes e métodos. Java te força a programar em classes, desde o primeiro contato você vai programar em uma classe, mas nem por isso você está programando orientado a objetos. Programar orientado a objetos é programar códigos como se fossem objetos da vida real. Por exemplo, [...]]]></description>
			<content:encoded><![CDATA[<p>Programar orientado a objetos é muito mais que construir classes e métodos. Java te força a programar em classes, desde o primeiro contato você vai programar em uma classe, mas nem por isso você está programando orientado a objetos. Programar orientado a objetos é programar códigos como se fossem objetos da vida real. Por exemplo, um objeto ser humano poderia ter os atributos (ou propriedades, se preferir) nome, altura, peso, cor, data de nascimento e métodos andar, correr, saltar, dormir e esse objeto poderia interagir com outros objetos desse mundo.</p>
<blockquote><p>Objeto é uma instância de uma classe. Classe é uma fábrica de objetos.</p></blockquote>
<p>Os exemplos que encontramos por ai muitas vezes não fazem muito sentido com o contexto que programamos. Vou focar na web. Onde entraria o objeto ser humano e método correr em um site? Só se disséssemos que correr é o sair (logout) de uma área restrita, que não seria muito legal, mas andar, saltar e dormir continuariam sem fazer sentido. Esses métodos seriam bons para jogos e aplicações gráficas.</p>
<p>Agora, e se convertêssemos o objeto ser humano para usuário, suas propriedades fossem nome, sobrenome, e-mail e senha e métodos nome completo e logout. Faz sentido em um site, não? Se o site for um e-commerce poderíamos adicionar os métodos: adicionar item no carrinho, remover item do carrinho e finalizar compra.</p>
<p>Objetos interagem com outros objetos através de estados (atributos), entradas (parâmetros) e retornos de métodos. No exemplo anterior o objeto usuário adiciona itens em seu carrinho de compras, mas que itens? Objetos do tipo produto e estado tem no estoque.</p>
<h2>Herança</h2>
<p>Um dos três pilares da programação orientada a objetos é a herança, ou seja, um dia você vai ter que dominar esse conceito e mais dois pra poder dizer que realmente sabe programação orientada a objetos. Os outros dois conceitos, ou pilares são encapsulamento e polimorfismo.</p>
<p>Na herança um objeto herda atributos e métodos de outro objeto. Essa herança deve ser feita com cautela. Para um objeto herdar outro objeto deve haver uma forte relação entre eles. A classe produto, por exemplo, poderia ter os herdeiros CD de áudio, filme DVD e livro. O que esses objetos têm em comum é que todos são produtos, podem ser comprados e adicionados no carrinho, tem preço, peso e dimensões. Cada um desses objetos também tem suas especialidades, senão não justificaria sua existência, apenas um bastaria. O CD de áudio tem faixas, filme tem idiomas de áudio e legenda e duração e livro tem autor, editora e páginas.</p>
<p>Quando um objeto herda outro objeto o herdeiro passa a ter o tipo do objeto herdado. O que isso significa? Imaginemos o método adicionar item no carrinho do objeto usuário. Esse método precisa receber um objeto do tipo produto para então adicionar no carrinho de compras. Um CD de áudio é do tipo CD de áudio, mas a medida que um objeto herda outro objeto e assume o seu tipo, então CD de áudio também é do tipo produto e poderá ser adicionado no carrinho.</p>
<p>Se ainda ficou um pouco confuso, pense em um restaurante que somente aceite pessoas descendentes de sua avó. Sua mãe e você poderão entrar, mas eu não, a menos que sejamos parentes, minha mãe seja irmã de sua mãe ou filha. Isso é o tipo. Objetos herdam e carregam tipos de outros objetos.</p>
<p>E onde entra o produto herdar a classe de banco de dados? Não entra, não há relação nisso! Muitos programadores cometem esse erro por quererem facilitar consultas ou outras operações no banco de dados. Não comenta esse erro. Objetos na vida real herdam objetos quando há uma relação entre eles, faça o mesmo na programação.</p>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li><li><a href="http://www.jarbs.com.br/mergulhando-no-css-parte-1,589.html" rel="bookmark" class="crp_title">Mergulhando no CSS &#8211; Parte 1</a></li><li><a href="http://www.jarbs.com.br/como-usar-nodename-e-outras-propriedades-e-metodos-dom-em-jquery,398.html" rel="bookmark" class="crp_title">Como usar nodeName e outras propriedades e métodos DOM em jQuery?</a></li><li><a href="http://www.jarbs.com.br/unindo-e-definindo-novos-atributos-em-objetos,393.html" rel="bookmark" class="crp_title">Unindo e definindo novos atributos em objetos</a></li><li><a href="http://www.jarbs.com.br/javascript-objeto-literal,55.html" rel="bookmark" class="crp_title">Javascript Objeto Literal</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/introducao-a-programacao-orientada-a-objetos-e-a-heranca,535.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validar números de telefones com expressão regular em PHP</title>
		<link>http://www.jarbs.com.br/validar-numeros-de-telefones-com-expressao-regular-em-php,530.html</link>
		<comments>http://www.jarbs.com.br/validar-numeros-de-telefones-com-expressao-regular-em-php,530.html#comments</comments>
		<pubDate>Fri, 14 May 2010 16:59:44 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Expressão Regular]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Número de telefone]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=530</guid>
		<description><![CDATA[Tudo que segue um padrão pode ser validado ou tratado por expressões regulares, inclusive os números de telefone.
<strong>is_tel</strong> é um função que usa expressão regular para validar e separar números de telefone, levando em consideração o número, código de cidade/área e código de país. Retorna um array de índices <em>country</em>, <em>city</em> e <em>number</em> com seus valores reespectivos caso a string de entrada seja um número de telefone válido ou então retorna falso.]]></description>
			<content:encoded><![CDATA[<p>Tudo que segue um padrão pode ser validado ou tratado por expressões regulares, inclusive os números de telefone.</p>
<p><strong>is_tel</strong> é uma função que usa expressão regular para validar e separar números de telefone, levando em consideração o número, código de cidade/área e código de país. Retorna um array de índices <em>country</em>, <em>city</em> e <em>number</em> com seus valores caso a string de entrada seja validada pela expressão regular ou então retorna falso.</p>
<p><u>Exemplo:</u></p>
<pre>if ($tel = is_tel('+55 11 1234-5678')) {
	echo 'telefone válido';
	print_r($tel);
}

<em>array
(
	[country] =&gt; 55,
	[city] =&gt; 11,
	[number] =&gt; 1234-5678
)</em></pre>
<p>Com esta função você pode validar campos livres para telefone e depois até mesmo armazenar os dados separadamente.</p>
<p><strong>Bateria de testes</strong></p>
<pre># número
is_tel('1234-5678');
<em>// true - array(number =&gt; 1234-5678)</em>

# número de 7 dígitos
is_tel('123-4567');
<em>// true - array(number =&gt; 123-4567)</em>

# código de cidade, área
is_tel('11 12345678');
<em>// true - array(city =&gt; 11, number =&gt; 1234-5678)</em>

# código de país e cidade
is_tel('55 11 1234.5678');
<em>true - array(country =&gt; 55, city =&gt; 11, number =&gt; 1234-5678)</em>

# código de país e cidade com número de 7 dígitos
is_tel('55 11 123-4567');
<em>true - array(country =&gt; 55, city =&gt; 11, number =&gt; 123-4567)</em>

# códigos de país e cidade com mais de 2 dígitos
is_tel('1024 680 1234 5678');
<em>true - array(country =&gt; 1024, city =&gt; 680, number =&gt; 1234-5678)</em>

# outras formatações
is_tel('(+55) (11) 1234-5678');
<em>true - array(country =&gt; 55, city =&gt; 11, number =&gt; 1234-5678)</em>

is_tel('+55 (11) 1234 5678');
<em>true - array(country =&gt; 55, city =&gt; 11, number =&gt; 1234-5678)</em>

# separador diferente de hífen
is_tel('1234-5678', '.');
<em>true</em> - array(number =&gt; 1234.5678);

# sem separador
is_tel('1234-5678', '');
<em>true</em> - array(number =&gt; 12345678)

# inválidos
is_tel('abcd-1234');
<em>false</em>

is_tel('1234-567a');
<em>false</em></pre>
<p><strong>Código fonte</strong></p>
<pre>/**
 * Função para validar números de telefones.
 * Retorna um array com código do país, código da cidade e número de telefone.
 *
 * @author Alejandro Fernandez Moraga &lt;moraga86@gmail.com&gt;
 * @param string $str String de entrada
 * @param string $glue String usada para unir os números do telefone
 * @return array|false
 */

function is_tel($str, $glue='-') {
	return preg_match('#^(?:(?:\(?\+?(?P&lt;country&gt;\d{2,4})\)?\s*)?\(?(?P&lt;city&gt;\d{2,3})\)?\s*)?(?P&lt;n1&gt;\d{3,4})[-\s.]?(?P&lt;n2&gt;\d{4})$#', $str, $matches) ?
		array(
			'country' =&gt; $matches['country'],
			'city' =&gt; $matches['city'],
			'number' =&gt; $matches['n1'] . $glue . $matches['n2']
		)
		: false;
}</pre>
<h4>Encontrando telefones em strings</h4>
<p>Você pode usar a expressão regular da função para buscar números de telefones em strings.</p>
<pre>#(?:(?:\(?\+?(?P&lt;country&gt;\d{2,4})\)?\s*)?\(?(?P&lt;city&gt;\d{2,3})\)?\s*)?(?P&lt;n1&gt;\d{3,4})[-\s.]?(?P&lt;n2&gt;\d{4})#</pre>
<p>Só não se esqueça de remover que marcam ínicio e término da string, ^ e $.</p>
<pre>preg_match_all(
	'#(?:(?:\(?\+?(?P&lt;country&gt;\d{2,4})\)?\s*)?\(?(?P&lt;city&gt;\d{2,3})\)?\s*)?(?P&lt;n1&gt;\d{3,4})[-\s.]?(?P&lt;n2&gt;\d{4})#',
	$string,
	$matches
);</pre>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/codificando-json-em-php,252.html" rel="bookmark" class="crp_title">Codificando JSON em PHP</a></li><li><a href="http://www.jarbs.com.br/valor-monetario-float-a-todo-custo,564.html" rel="bookmark" class="crp_title">Valor monetário (float) a todo custo</a></li><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li><li><a href="http://www.jarbs.com.br/gerando-combinacoes-dos-itens-de-arrays-em-php,437.html" rel="bookmark" class="crp_title">Gerando combinações dos itens de arrays em PHP</a></li><li><a href="http://www.jarbs.com.br/validar-cpf-em-php,62.html" rel="bookmark" class="crp_title">Validar CPF em PHP</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/validar-numeros-de-telefones-com-expressao-regular-em-php,530.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CERT.br registra aumento de notificações de ataques a servidores web</title>
		<link>http://www.jarbs.com.br/cert-br-registra-aumento-de-notificacoes-de-ataques-a-servidores-web,524.html</link>
		<comments>http://www.jarbs.com.br/cert-br-registra-aumento-de-notificacoes-de-ataques-a-servidores-web,524.html#comments</comments>
		<pubDate>Thu, 29 Apr 2010 17:12:41 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[ataques]]></category>
		<category><![CDATA[CERT.br]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=524</guid>
		<description><![CDATA[20 de abril de 2010 Relatos de tentativas de fraude se mantiveram estáveis no trimestre; phishing aumentou 61% em um ano O Centro de Estudos, Resposta e Tratamento de Incidentes de Segurança no Brasil (CERT.br), um dos serviços disponibilizados pelo Núcleo de Informação e Coordenação do Ponto BR (NIC.br), divulga as estatísticas de relatos enviados [...]]]></description>
			<content:encoded><![CDATA[<p>20 de abril de 2010</p>
<p><em>Relatos de tentativas de fraude se mantiveram estáveis no trimestre; phishing aumentou 61% em um ano</em></p>
<p>O Centro de Estudos, Resposta e Tratamento de Incidentes de Segurança no Brasil (CERT.br), um dos serviços disponibilizados pelo Núcleo de Informação e Coordenação do Ponto BR (NIC.br), divulga as estatísticas de relatos enviados espontaneamente por administradores e usuários envolvendo redes brasileiras no primeiro trimestre de 2010. Segundo o CERT.br, o total de notificações de incidentes no primeiro trimestre de 2010 foi superior a 28 mil, representando um decréscimo de 8% em relação ao trimestre anterior e de 87% em relação ao mesmo período de 2009.</p>
<p>As notificações sobre ataques a servidores Web cresceram 13% em relação ao trimestre anterior e 42% em relação ao mesmo período de 2009. De acordo com Cristine Hoepers, analista de segurança do CERT.br, esses ataques possuem diversas intenções: “eles exploram diversas vulnerabilidades em aplicações Web e estão sendo utilizados para manter repositórios de ferramentas utilizadas em ataques a outros servidores Web e de scripts para envio de spam ou scam, além de visarem a hospedagem de páginas falsas de instituições financeiras e de cavalos de tróia”, afirma.</p>
<p>Relatos de tentativas de fraude foram superiores a 8 mil no primeiro trimestre de 2010, correspondendo a um decréscimo de 6% em relação ao trimestre anterior e a um decréscimo de 95% em relação ao mesmo período de 2009. O maior responsável pela redução em relação ao primeiro trimestre de 2009 foi a redução nas notificações de eventuais quebras de direitos autorais, através de distribuição de material em redes P2P.</p>
<p>O número de notificações de páginas falsas de bancos e sites de comércio eletrônico (phishing tradicional) sofreu um aumento de 9% em relação ao trimestre anterior e foi 61% maior em relação ao mesmo período de 2009. Para mitigar esse tipo de abuso, o NIC.br disponibiliza desde 2008 o Domínio de Primeiro Nível (DPN) “<a href="http://b.br">.b.br</a>”, exclusivo para bancos e com DNSSec obrigatório. Relatos sobre cavalos de tróia, utilizados para furtar informações e credenciais, reduziram 9% em relação ao quarto trimestre de 2009, mas foram 12% maiores do que as notificações recebidas no mesmo período de 2009. As notificações referentes a varreduras reduziram 27% em relação ao trimestre anterior e cerca de 10% em relação ao mesmo período de 2009.</p>
<p>Os serviços que podem sofrer ataques de força bruta como SSH (22/TCP), FTP (21/TCP) e TELNET (23/TCP) ainda estão sendo muito visados nas varreduras, correspondendo a, respectivamente, 59%, 3% e 2% das notificações de varreduras.</p>
<p>As notificações de varreduras de SMTP (25/TCP) continuam em destaque atingindo 19% do total.  As reclamações em sua maior parte foram referentes a computadores brasileiros, conectados via banda larga, que tentaram identificar relays abertos fora do Brasil, com intuito de posteriormente enviar spam.</p>
<p>Desde 2006, o CGI.br mantém o site: <a href="http://www.antispam.br">Antispam.br</a>, para a ação e a educação dos internautas e administradores de rede contra o abuso no envio de e-mails não solicitados. Em 2009, foi publicada a resolução “Recomendação para Adoção de Gerência de Porta 25 em Redes de Caráter Residencial”, para a adoção de boas práticas anti-spam para o país.</p>
<p>As notificações de atividades relacionadas com a propagação de worms totalizaram quase 6 mil, correspondendo a um crescimento de 29% em relação ao trimestre anterior e decréscimo de 81% em relação ao mesmo período de 2009.</p>
<p>Ainda no primeiro trimestre de 2010 foram recebidos 1.861 relatos que se enquadraram na categoria &#8220;outros&#8221;, correspondendo ao acréscimo de 36% em relação ao quarto trimestre de 2009 e de 201% em relação ao mesmo período de 2009. Esta categoria está relacionada à hospedagem de scripts e toolkits, utilizados para comprometimento de sites de terceiros.</p>
<p><strong>Spam</strong></p>
<p>Seguindo o forte aumento de 2009, o primeiro trimestre de 2010 contabilizou mais de 10 milhões de notificações referentes a spam. Em todo o ano de 2009, o CERT.br recebeu 17,2 milhões de notificações dessa categoria, a maior quantidade já registrada.</p>
<p><strong>Estatísticas sobre incidentes de segurança estão disponíveis em:</strong> <a href="http://www.cert.br/stats/incidentes">http://www.cert.br/stats/incidentes</a>.</p>
<p><strong>Estatísticas sobre spam estão disponíveis em:</strong> <a href="http://www.cert.br/stats/spam">http://www.cert.br/stats/spam</a>.</p>
<p><strong>A lista de bancos que possuem domínios “.b.br” está disponível em:</strong> <a href="http://www.nic.br/atividades/dom-bbr.htm">http://www.nic.br/atividades/dom-bbr.htm</a>.</p>
<p><strong>Sobre o CERT.br</strong></p>
<p>O CERT.br é o Centro de Estudos, Resposta e Tratamento de Incidentes de Segurança no Brasil. Desde 1997, o grupo é responsável por tratar incidentes de segurança envolvendo redes conectadas à Internet no Brasil. O Centro também desenvolve atividades de análise de tendências, treinamento e conscientização, com o objetivo de aumentar os níveis de segurança e de capacidade de tratamento de incidentes no Brasil.</p>
<p><strong>Mais informações em:</strong> <a href="http://www.cert.br">http://www.cert.br</a>.</p>
<p><strong>Sobre o Núcleo de Informação e Coordenação (NIC.br)</strong></p>
<p>O Núcleo de Informação e Coordenação do Ponto BR — NIC.br (<a href="http://www.nic.br">http://www.nic.br</a>) é uma entidade civil, sem fins lucrativos, que implementa as decisões e projetos do Comitê Gestor da Internet no Brasil. São atividades permanentes do NIC.br coordenar o registro de nomes de domínio — Registro.br (<a href="http://www.registro.br">http://www.registro.br</a>), estudar, responder e tratar incidentes de segurança no Brasil &#8211; CERT.br (<a href="http://www.cert.br">http://www.cert.br</a>), estudar e pesquisar tecnologias de redes e operações — CEPTRO.br (<a href="http://www.ceptro.br">http://www.ceptro.br</a>), produzir indicadores sobre as tecnologias da informação e da comunicação — CETIC.br (<a href="http://www.cetic.br">http://www.cetic.br</a>) e abrigar o escritório do W3C no Brasil (http://www.w3c.br).</p>
<p><strong>Sobre o Comitê Gestor da Internet no Brasil – CGI.br</strong></p>
<p>O Comitê Gestor da Internet no Brasil coordena e integra todas as iniciativas de serviços Internet no país, promovendo a qualidade técnica, a inovação e a disseminação dos serviços ofertados.</p>
<p><strong>Mais informações em:</strong> <a href="http://www.cgi.br/">http://www.cgi.br</a>.</p>
<p><strong>Para mais informações, acesse:</strong> <a href="http://www.s2.com.br">http://www.s2.com.br</a> ou <a href="http://www.cgi.br">http://www.cgi.br</a>.</p>
<p>Fonte: <a href="http://www.nic.br/imprensa/releases/2010/rl-2010-07.htm">http://www.nic.br/imprensa/releases/2010/rl-2010-07.htm</a></p>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/sitemap,112.html" rel="bookmark" class="crp_title">Sitemap</a></li><li><a href="http://www.jarbs.com.br/contradicao-trabalhista,471.html" rel="bookmark" class="crp_title">Contradição trabalhista</a></li><li><a href="http://www.jarbs.com.br/copiar-diretorios-inteiros-em-php,203.html" rel="bookmark" class="crp_title">Copiar diretórios inteiros em PHP</a></li><li><a href="http://www.jarbs.com.br/strip-tags-em-python,121.html" rel="bookmark" class="crp_title">Strip tags em Python</a></li><li><a href="http://www.jarbs.com.br/6-passos-para-conseguir-boas-palavras-chave-e-distribuir-seu-conteudo,45.html" rel="bookmark" class="crp_title">6 passos para conseguir boas palavras-chave e distribuir seu conteúdo</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/cert-br-registra-aumento-de-notificacoes-de-ataques-a-servidores-web,524.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mover arquivos sem sobrescrever arquivos existentes acrescentando número incremental em PHP</title>
		<link>http://www.jarbs.com.br/mover-arquivos-sem-sobrescrever-arquivos-existentes-acrescentando-numero-incremental-em-php,520.html</link>
		<comments>http://www.jarbs.com.br/mover-arquivos-sem-sobrescrever-arquivos-existentes-acrescentando-numero-incremental-em-php,520.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 19:13:09 +0000</pubDate>
		<dc:creator>Alejandro Moraga</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[move]]></category>
		<category><![CDATA[move_uploaded_file]]></category>
		<category><![CDATA[rename]]></category>

		<guid isPermaLink="false">http://www.jarbs.com.br/?p=520</guid>
		<description><![CDATA[A função <strong>move</strong> move um arquivo para uma nova localização sem sobrescrever um arquivo existente acrescentando um número incremental entre o nome e extensão do arquivo movido.

Se você quer fazer uploads de arquivos sem alterar o nome original do arquivo enviado <strong>move</strong> é uma ótima opção.]]></description>
			<content:encoded><![CDATA[<p>A função <strong>move</strong> move um arquivo para uma nova localização sem sobrescrever um arquivo existente acrescentando um número incremental entre o nome e extensão do arquivo movido.</p>
<p>Se você quer fazer upload de arquivos sem alterar o nome original do arquivo enviado <strong>move</strong> é uma ótima opção.</p>
<p><u>Exemplos:</u></p>
<p><strong>Arquivo</strong></p>
<pre>// primeira vez
move('images/bg.jpg', 'images/background/bg.jpg');
// <em>images/background/bg.jpg</em>

// segunda vez, supondo que bg.jpg foi recolocado no diretório images
move('images/bg.jpg', 'images/background/bg.jpg');
// <em>images/background/bg-1.jpg</em>

// terceira vez
move('images/bg.jpg', 'images/background/bg.jpg');
// <em>images/background/bg-2.jpg</em></pre>
<p><strong>Upload</strong></p>
<pre>move($_FILES['arquivo']['tmp_name'], 'uploads/'.$_FILES['arquivo']['name']);</pre>
<p><strong>Move</strong> substitui <a target="_blank" href="http://br2.php.net/manual/pt_BR/function.move-uploaded-file.php">move_uploaded_file</a>? Sim. Arquivos enviados são armazenados em um diretório temporário definido pelo servidor, como por exemplo no Linux o <code>/tmp</code> por padrão. Mover arquivos de <code>/tmp</code> ou de um outro diretório qualquer é a mesma coisa, sempre que o usuário tenha as permissões necessárias no diretório.</p>
<h4>Código fonte</h4>
<pre>&lt;php

/**
 * Move
 *
 * @author Alejandro Fernandez Moraga &lt;moraga86@gmail.com&gt;
 * @param string $filename Arquivo
 * @param string $destination Destino do arquivo
 * @return string|false
 */

function move($filename, $destination) {
	# separa diretório e nome do arquivo da extensão usando expressão regular
	$name = preg_split('#(?:\.([^\.]+))?$#', $destination, -1, PREG_SPLIT_DELIM_CAPTURE);
	# array com informações do arquivo
	$meta = array($name[0], '', $name[1] ? '.' : '', $name[1]);

	# laço percorre o diretório destino procurando por arquivos com mesmo nome
	# acrescenta um valor incremental entre o nome e extensão do arquivo
	# quando um arquivo de mesmo nome é encontrado
	for ($i=0; file_exists($file = implode($meta)); $meta[1]=--$i);

	# renomeia o arquivo
	# retorna o nome do arquivo movido ou falso
	return rename($filename, $file) ? $file : false;
}

?&gt;</pre>
<div id="crp_related"><h3>Leia mais:</h3><ul><li><a href="http://www.jarbs.com.br/tar-compactar-e-descompactar-arquivos,15.html" rel="bookmark" class="crp_title">TAR compactar e descompactar arquivos</a></li><li><a href="http://www.jarbs.com.br/macro-converter-multiplos-arquivos-docx-para-doc-e-outras-extensoes,513.html" rel="bookmark" class="crp_title">Macro: Converter múltiplos arquivos docx para doc e outras extensões</a></li><li><a href="http://www.jarbs.com.br/manipulacao-de-constantes-em-php,238.html" rel="bookmark" class="crp_title">Manipulação de constantes em PHP</a></li><li><a href="http://www.jarbs.com.br/copiar-diretorios-inteiros-em-php,203.html" rel="bookmark" class="crp_title">Copiar diretórios inteiros em PHP</a></li><li><a href="http://www.jarbs.com.br/converter-array-para-objetos-especificos-em-php,597.html" rel="bookmark" class="crp_title">Converter array para objetos específicos em PHP</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.jarbs.com.br/mover-arquivos-sem-sobrescrever-arquivos-existentes-acrescentando-numero-incremental-em-php,520.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
