Pular para o conteúdo

Cotação do Dólar e outras moedas

Criei esta classe PHP para extrair as cotações das principais moedas usando como fonte de consulta o site de Economia da UOL.

Exemplo de uso:

<?
//importar a classe
require("class.UOLCotacoes.php");

$uol = new UOLCotacoes(); // criar uma instancia da classe

//receber os valores
list($dolarComercialCompra, $dolarComercialVenda, $dolarTurismoCompra, $dolarTurismoVenda, $euroCompra, $euroVenda, $libraCompra, $libraVenda, $pesosCompra, $pesosVenda) = $uol->pegaValores();
?>

A partir do código acima você já tem os valores de câmbio do Dólar, Euro, Libra e Pesos Argentino.
Fábio Berbert de Paula fabio
Hits: 16.562 Categoria: PHP Subcategoria: Expressões Regulares
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

Criei esta classe PHP para extrair as cotações das principais moedas usando como fonte de consulta o site de Economia da UOL.

Exemplo de uso:

<?
//importar a classe
require("class.UOLCotacoes.php");

$uol = new UOLCotacoes(); // criar uma instancia da classe

//receber os valores
list($dolarComercialCompra, $dolarComercialVenda, $dolarTurismoCompra, $dolarTurismoVenda, $euroCompra, $euroVenda, $libraCompra, $libraVenda, $pesosCompra, $pesosVenda) = $uol->pegaValores();
?>

A partir do código acima você já tem os valores de câmbio do Dólar, Euro, Libra e Pesos Argentino.
Download class.UOLCotacoes.php Enviar nova versão

Versões atualizadas deste script

Esconder código-fonte

<?
/*
   class.uolCotacoes.php - classe usada para extrair as cotações de moedas 
   do dia junto ao site de Economia da UOL - economia.uol.com.br/cotacoes/

   Autor: Fábio Berbert de Paula <fberbert@gmail.com>
   http://www.vivaolinux.com.br/~fabio

   17/01/2013
   Versão: 1.0
*/

class UOLCotacoes {

   public function pegaValores() {

      // o fopen também funciona para arquivos da rede, uau!
      if(!$fp=fopen("http://economia.uol.com.br/cotacoes/" ,"r" )) { 
         echo "Erro ao abrir a página de cotação" ; 
         return(0);
      } 

      //variáveis de classe
      $arrayValores = array();

      //inicio do processamento - ler página
      $uolHTML = "";
      while(!feof($fp)) { // leia o conteúdo da página, uma linha por vez, armazene na variável uolHTML
         $uolHTML .= fgets($fp); 
      }
      fclose($fp);

      /* o bloco do código HTML referente a cotação é assim:

      <td class="pg-color4"><a href="http://economia.uol.com.br/cotacoes/cambio/dolar-comercial-estados-unidos/">Dólar com.</a></td>
      <td>2,0435</td>
      <td>2,0442</td>

      Então o que farei é extrair os valores 2,0435 (compra) e 2,0442 (venda)
      O mesmo conceito se repete para as demais cotações
      */

      //array contendo as expressoes regulares que indicam cada moeda
      $patterns = array(
         "dolarComercial" => "/pg-color4.*dolar-comercial-estados-unidos/",
         "dolarTurismo"   => "/pg-color4.*dolar-turismo-estados-unidos/",
         "euro"  => "/pg-color4.*euro-uniao-europeia/",
         "libra" => "/pg-color4.*libra-esterlina/",
         "pesos" => "/pg-color4.*peso-argentina/",
      );


      $uolHTML = preg_replace("/.*div id=.cambio.>/", "", $uolHTML); 
      $uolHTML = preg_replace("/<tr>/", "\n<tr>", $uolHTML); //acrescentar quebra de linha
      $uolHTML = preg_replace("/<td/", "\n<td", $uolHTML); //acrescentar quebra de linha

      $arrayHTML = split("\n", $uolHTML);


      //loop para cada moeda
      while( list($moeda, $pattern) = each($patterns) ) {

         $arrayHTML = split("\n", $uolHTML);

         //loop por cada linha da pagina HTML
         while ( list($indice, $linha) = each($arrayHTML) ) {

            //se bloco HTML casa com a pattern da moeda do looping atual...
            if (preg_match($pattern, $linha)) {

               //print "Encontrei '$pattern' em: $linha\n\n";

               //ler proxima linha
               $linha = $arrayHTML[++$indice]; 

               //pegar cotacao compra
               preg_match("/<td>(.*)<\/td>/", $linha, $valor);
               $compra = $valor[1];

               //ler proxima linha
               $linha = $arrayHTML[++$indice]; 

               //pegar cotacao venda
               preg_match("/<td>(.*)<\/td>/", $linha, $valor);
               $venda = $valor[1];

               //atribuindo valores ao array de retorno
               array_push($arrayValores, $compra, $venda);
            }

         } // fim while

      } // fim while

      return($arrayValores);

   } //fim function pegaValores

} //fim classe
?> 

Cálculo de Férias

Quebrando nomes compostos

Gerando senhas dinamicamente com PHP

Formata número em Moeda

Função que identifica acentos em palavras (strings)

#1 Comentário enviado por guilhermemuller em 22/10/2014 - 11:01h
Como faço para exibir estes dados?
#2 Comentário enviado por fabio em 22/10/2014 - 13:23h
Guilherme,

Dê uma lida na descrição do script. Lá tem um trecho de código que exemplifica como usar a classe.

[]'s
#3 Comentário enviado por Nilmaicon em 06/07/2015 - 19:55h
Parabéns Fábio, muito bom!!!
#4 Comentário enviado por thiagopm em 02/12/2015 - 08:38h

Galera, eu olhei a classe na versão 2, porém não consegui, de forma alguma, buscar o valor da variação da moeda.
O valor da variação da moeda está na mesma linha que os valores de cotação. Alguém poderia me dar um auxilio nisso?
Agradeço desde já.
#5 Comentário enviado por fabio em 02/12/2015 - 12:06h

[4] Comentário enviado por thiagopm em 02/12/2015 - 08:38h


Galera, eu olhei a classe na versão 2, porém não consegui, de forma alguma, buscar o valor da variação da moeda.
O valor da variação da moeda está na mesma linha que os valores de cotação. Alguém poderia me dar um auxilio nisso?
Agradeço desde já.


Neste caso é necessário atualizar a regexp prevendo o conteúdo em apenas uma linha. Esse é o problema, toda vez que o site muda temos que atualizar a regexp. O ideal seria você se aprofundar em expressões regulares para conseguir fazer manutenção no script.

P.S.: Acabei de subir uma versão atualizada usando jQuery (JavaScript), dê uma olhada aqui.
#6 Comentário enviado por thiagopm em 02/12/2015 - 14:32h
Eu já pesquisei bastante sobre expressões regulares, porém, a dificuldade que encontrei foi conseguir buscar o sinal ( + ou -) da variação do preço da moeda. Eu consigo buscar o valor, sem problemas, porém esse sinal tá me dando trabalho.
Você teria alguma dica para estar buscando a variação? Acredito que não deva ser tão complicado, considerando que esta tudo na mesma linha do valor das cotações, e a classe na versão 2 esta funcionando perfeitamente.
#7 Comentário enviado por eumanito em 09/04/2016 - 10:46h
Estou com um problema, utilizando um servidor da Kinghost a função fopen("http://economia.uol.com.br/cotacoes/","r") está retornando um html diferente do correto.

Testei em outro servidor e funciona, vem certinho o conteúdo. O que parece é que o UOL detecta como um dispositivo mobile e lista o conteúdo adaptado, outro HTML, então a classe de cotações não encontra os dados.

Alguém tem alguma ideia?
#8 Comentário enviado por fabio em 11/04/2016 - 08:39h

[7] Comentário enviado por eumanito em 09/04/2016 - 10:46h

Estou com um problema, utilizando um servidor da Kinghost a função fopen("http://economia.uol.com.br/cotacoes/","r") está retornando um html diferente do correto.

Testei em outro servidor e funciona, vem certinho o conteúdo. O que parece é que o UOL detecta como um dispositivo mobile e lista o conteúdo adaptado, outro HTML, então a classe de cotações não encontra os dados.

Alguém tem alguma ideia?


Você pode tentar forçar um user-agent para o fopen. Tente colocar este código no início do script:

ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1) Gecko/20090615 Firefox/3.5');

#9 Comentário enviado por eumanito em 12/04/2016 - 09:46h
Funcionou , Fábio. Obrigado.
#11 Comentário enviado por jbwestphal em 13/07/2017 - 15:05h
Olá! Estou usando o código e percebi que tem um delay grande de atualização dos valores das cotações. O que poderia ser, algum tipo de cache?
Estou apenas imprimindo os valores na tela, como teste, e comparei os valores no site da uol.

Contribuir com comentário

Entre na sua conta para comentar.