Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tocho

[Resolvido] Expressão Regular - Pegar valores de uma string HTML

Recommended Posts

Com essa linha de código:

 

$html = file_get_contents('http://www.siteexterno.com.br');

 

Eu consigo obter o html de um site, esse código html tem três valores:

 

<html>

..

 

<body>

..

.

<b>R$ 18,90</b>

<b>R$ 150,40</b>

<b>R$ 350,99</b>

 

</body>

</html>

 

 

Eu preciso pegar esses tres valores: 18,90; 150,40; 350,99.

 

Acredito que o caminho é usar preg_match, mas ainda não obtive sucesso.

 

Alguém pode ajudar?

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode fazer assim:

 

$achou = array();
preg_match_all("/<b>R$([0-9]+,[0-9]{2})</b>/", $html, $achou);

O que acontece, você vai ter uma array $achou, cada elemento dela corresponde a um desses valores que você quer achar. Cada elemento será uma array, dentro de cada uma dessas arrays você pode acessar o texto inteiro através do elemento 0 e acessar apenas o valor através do elemento 1.

Exemplo:

$achou[0][0] seria <b>R$ 18,90</b>

$achou[0][1] seria 18,90

 

Aqui um link para a função:

http://br2.php.net/manual/pt_BR/function.preg-match-all.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode fazer assim:

 

$achou = array();
preg_match_all("/<b>R$([0-9]+,[0-9]{2})</b>/", $html, $achou);

O que acontece, você vai ter uma array $achou, cada elemento dela corresponde a um desses valores que você quer achar. Cada elemento será uma array, dentro de cada uma dessas arrays você pode acessar o texto inteiro através do elemento 0 e acessar apenas o valor através do elemento 1.

Exemplo:

$achou[0][0] seria <b>R$ 18,90</b>

$achou[0][1] seria 18,90

 

Aqui um link para a função:

http://br2.php.net/manual/pt_BR/function.preg-match-all.php

Apareceu o seguinte erro:

 

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier 'b' in line..

 

A linha que o erro se refere é: preg_match_all("/<b>R$([0-9]+,[0-9]{2})</b>/", $html, $matches);

 

A propósito!... achei show sua expressão regular....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa erro meu!

 

 

preg_match_all("@<b>R$([0-9]+,[0-9]{2})</b>@", $html, $achou);

 

 

Tenta agora!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa erro meu!

 

 

preg_match_all("@<b>R$([0-9]+,[0-9]{2})</b>@", $html, $achou);

 

 

Tenta agora!

 

O erro não aparece mais, mas está estranho, não retorna nada, fiz um exemplo:

 

$html2 = "minha teraa <b>R$ 15,60</b> é muito boa";
  
$pattern = "@<b>R$([0-9]+,[0-9]{2})</b>@";
preg_match_all($pattern, $html2, $matches);

Resultado: array(2) { [0]=> array(0) { } [1]=> array(0) { } }

 

Será que é alguma configuração do meu PHP? Nao entendi, tinha que retornar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

$pattern = "@<b>R\$(?: )*([0-9]+,[0-9]{2})</b>@";

 

Tenta agora. Não estou testando isso por isso pode continuar dando erro mas alguma hora acerta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$pattern = "@<b>R\$(?: )*([0-9]+,[0-9]{2})</b>@";

 

Tenta agora. Não estou testando isso por isso pode continuar dando erro mas alguma hora acerta.

 

Ainda não funcionou, mas, fiz assim:

 

$pattern = "@([0-9]+,[0-9]{2})@";

 

Serviu para o momento, vou pesquisar mais sobre expressões regulares para conseguir delimitar o <b>

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui arrumar aqui, parece que precisava de mais uma contra-barra:

 

<?php $html2 = "minha teraa <b>R$ 15,60</b> <b>R$16,60</b> é muito boa";
  
$pattern = "@<b>R\\$(?: )*([0-9]+,[0-9]{2})</b>@";
preg_match_all($pattern, $html2, $matches);

print_r($matches);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui arrumar aqui, parece que precisava de mais uma contra-barra:

 

<?php $html2 = "minha teraa <b>R$ 15,60</b> <b>R$16,60</b> é muito boa";
  
$pattern = "@<b>R\\$(?: )*([0-9]+,[0-9]{2})</b>@";
preg_match_all($pattern, $html2, $matches);

print_r($matches);
?>

 

WOW...Grande!

 

Quem diria que essa contra-barra teria todo esse poder, hein!?..rs

 

Muito Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.