Ir para conteúdo

POWERED BY:

Arquivado

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

Antonio Jorge

Como fazer com preg_match?

Recommended Posts

Eu tenho um código onde uso preg_match para pegar dados do código fonte, e eu já pego vários dados com o mesmo comando, mas para esse trecho eu não consegui, veja o código onde está o trecho que eu preciso:

 

     <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

     8,031 KB | 2010-03-09 | ZIP File</p>
 </div>

 

Eu preciso pegar exatamente este trecho: "8,031 KB | 2010-03-09 | ZIP File" ou as três partes separadas.

 

Tentei assim:

 

preg_match('/<a href="([|.|]{0,5000})/i',$a,$data);

 

Para pegar pelo menos a data, mas não deu certo, não sei como lidar com os espaços, quem poder me ajudar eu agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 25/09/2012 at 12:46, Antonio Jorge disse:

Eu tenho um código onde uso preg_match para pegar dados do código fonte, e eu já pego vários dados com o mesmo comando, mas para esse trecho eu não consegui, veja o código onde está o trecho que eu preciso:

 

     <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

     8,031 KB | 2010-03-09 | ZIP File</p>
 </div>

 

Eu preciso pegar exatamente este trecho: "8,031 KB | 2010-03-09 | ZIP File" ou as três partes separadas.

 

Tentei assim:

 

preg_match('/<a href="([|.|]{0,5000})/i',$a,$data);

 

Para pegar pelo menos a data, mas não deu certo, não sei como lidar com os espaços, quem poder me ajudar eu agradeço.

 

Olá

 

$a = "8,031 KB | 2010-03-09 | ZIP File";
preg_match('/^([0-9]*),([0-9]*)\sKB\s[|]\s([0-9]{0,4}-[0-9]{0,2}-[0-9]{0,2})\s[|]\sZIP\sFile/',$a,$data)
echo $data[0];

 

Rex aceita somente KB e arquivo ZIP File. Você pode aprimorar o KB com limitação de caracteres.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A DIV contraparte desse </div> possui alguma definição específica como um ID ou uma class por exemplo?

 

Porque daí fica mais fácil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pior que não, sempre vai vir assim os dados, só muda as informações, veja outros exemplos:

 

    <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

     8,031 KB | 2010-03-09 | ZIP File</p>
 </div>

 

    <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

     1,2 MB | 2012-06-16 | PDF File</p>
 </div>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez você não tenha me entendido. Me refiro à isso:

 

<div class="foo">
   <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

   1,2 MB | 2012-06-16 | PDF File</p>
</div>

Você mostra o </div> mas não mostra a tag de abertura. Ela DEVE existir senão nem funcionar direito o layout funciona (ou pelo menos não deveria).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim, desculpe, lá vai:

 

<div class="fileDescription floatLeft">
   <h1 class="fileName lightblue">teste</h1>
   <p class="fileInfo lightgray">

   <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

   1,2 MB | 2012-06-16 | PDF File</p>
</div>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma vez que você sabe onde o texto alvo se encontra, delimitando seu início e fim, não importa o que tiver no meio:

 

<?php

$str = '<div class="fileDescription floatLeft">
   <h1 class="fileName lightblue">teste</h1>
   <p class="fileInfo lightgray">

   <a href="http://www.sitequalquer.com.br" class="teste">teste</a>

   1,2 MB | 2012-06-16 | PDF File</p>
</div>';

preg_match( '@<div class="fileDescription floatLeft">(.*)</div>@s', $str, $matches );

Isso vai te dar como saída:

 

array
 0 => string '<div class="fileDescription floatLeft">

   <h1 class="fileName lightblue">teste</h1>

   <p class="fileInfo lightgray">



   <a href="http://www.sitequalquer.com.br" class="teste">teste</a>



   1,2 MB | 2012-06-16 | PDF File</p>

</div>' (length=256)
 1 => string '

   <h1 class="fileName lightblue">teste</h1>

   <p class="fileInfo lightgray">



   <a href="http://www.sitequalquer.com.br" class="teste">teste</a>



   1,2 MB | 2012-06-16 | PDF File</p>

' (length=211)
string '1,2 MB | 2012-06-16 | PDF File' (length=30)

Se a estrutura em si for constante, você pode transformar num array o valor de $matches[ 1 ], limpar as ocorrências vazias e listar apenas o último índice.

 

Com o texto final em mãos, remove os espaços em branco nas bordas e a tag <p> no final:

 

$data = array_filter( explode( PHP_EOL, $matches[ 1 ] ) );

var_dump( strip_tags( trim( array_pop( $data ) ) ) );

Dessa forma você simplifica uma ER gigante através do pós-processamento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas o conteúdo é dinâmico, tudo em azul muda conforme a requisição do arquivo:

 

 

<div class="fileDescription floatLeft">

 

<h1 class="fileName lightblue">teste</h1>

 

<p class="fileInfo lightgray">

 

 

 

<a href="http://www.sitequalquer.com.br" class="teste">teste</a>

 

 

 

1,2 MB | 2012-06-16 | PDF File</p>

 

</div>

 

 

 

Mesmo assim é possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 25/09/2012 at 20:52, Antonio Jorge disse:

Sim, mas o conteúdo é dinâmico, tudo em azul muda conforme a requisição do arquivo:

 

 

<div class="fileDescription floatLeft">

 

<h1 class="fileName lightblue">teste</h1>

 

<p class="fileInfo lightgray">

 

 

 

<a href="http://www.sitequalquer.com.br" class="teste">teste</a>

 

 

 

1,2 MB | 2012-06-16 | PDF File</p>

 

</div>

 

 

 

Mesmo assim é possível?

 

Olá,

 

$a = "2,1 MB | 2010-03-09 | Imagem";
preg_match('/^([0-9]*),([0-9]*)\s(KB|MB|GB)\s[|]\s([0-9]{4}-[0-9]{2}-[0-9]{2})\s[|]\s([a-zA-Z0-9]*)/',$a,$data);
echo $data[0];

 

1- KB,MB,GB. Formato com apenas 1 vírgula.

2- Nome do arquivo, não aceita caracteres especiais.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 25/09/2012 at 21:54, Antonio Jorge disse:

Olá espiculo, não podemos fixar essa string porque ela muda sempre.

 

$a = "2.222,2 MB | 2010-03-09 | Imagem";
preg_match('/^([0-9,.]*)\s(KB|MB|GB)\s[|]\s([0-9]{4}-[0-9]{2}-[0-9]{2})\s[|]\s([a-zA-Z0-9 ]*)/',$a,$data);
echo $data[0]."<br />";
$separar = explode('|',$data[0]);

echo $separar[0]."<br />"; // tamanho arquivo
echo $separar[1]."<br />"; // data
echo $separar[2]."<br />"; // Tipo arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites
  Em 25/09/2012 at 20:52, Antonio Jorge disse:
Mesmo assim é possível?

Claro que é.

 

.* significa qualquer coisa, em qualquer quantidade. Contanto que a estrutura do HTML seja dentro dessa DIV com essa definição E a informação que você queira esteja sempre na última linha, sempre dará certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o que não funcionou.

 

Testei o que postei no post #8 agora em casa e funcionou. Testei o mesmo código com o HTML do post #9 e também funcionou.

 

E nesse link que você postou não existe um HTML com essas características, digo, essa DIV com essa class.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, você poderia ter sido mais claro.

 

Mas enfim... Você está testando a(s) solução (ões) apresentadas a fundo ou está apenas copiando/colando e vendo se roda?

 

Pergunto pois se você não utilizasse a solução pronta do post #8 você mesmo poderia resolver.

 

Veja, o problema aqui está no fato de o array_pop() estar assumindo que o texto desejado está na última linha.

 

Para o primeiro HTML postado ele de fato era a última informação depois da limpeza feita por array_filter().

 

Nesse último HTML, entretanto, depois dessa limpeza ainda restou um índice formado apenas por espaços, ficando o texto na penúltima posição.

 

Por padrão, array_filter() não considera esses casos, logo você tem de filtrar de uma forma personalizada:

 

$data = array_filter(

   explode( PHP_EOL, strip_tags( $matches[ 1 ] ) ),

   function( $item ) {

       $item = str_replace( ' ', '', $item );

       return ( ! empty( $item ) );
   }
);

var_dump( trim( array_pop( $data ) ) );

Agora sim o dado desejado está sempre na última posição. A menos que apareça outro fator atenuante não mencionado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz a modificação e não apareceu nada, veja como ficou:

 

$str = '<div class="fileDescription floatLeft">
   <h1 class="fileName light-blue lucida f24">Cute_FTP_8.0.7_Professional.zip</h1>
   <p class="fileInfo light-gray f11">

     by <a href="http://www.4shared.com/u/K-GuCQeN/B_u_t_h_a_i_n_a.html" class="fileOwner dark-gray lucida f11">B u t h a i n a </a>

     8,031 KB | 2010-03-09 | ZIP File</p>
 </div>';

$data = array_filter(

   explode( PHP_EOL, strip_tags( $matches[ 1 ] ) ),

   function( $item ) {

       $item = str_replace( ' ', '', $item );

       return ( ! empty( $item ) );
   }
);

var_dump( trim( array_pop( $data ) ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deveria aparecer um Notice apontando que a variável $matches não foi definida porque você removeu o preg_match().

 

Não é porque eu o suprimi para simplificar a explicação que ele deve ser removido do código, afinal, todo o problema está girando sobre sua utilização.

 

Mas se você não está vendo nada, significa que seus alertas deerro estão desativados ou muito baixos.

 

Lembre-se: SEMPRE ao desenvolver uma aplicação habilite os error e programe corretamente. Para isso inicie o script com:

 

ini_set( 'display_errors', TRUE );

error_reporting( E_ALL | E_STRICT ); // APENAS para PHP 5.3

error_reporting( E_ALL ); // Todas as outras versões que não sejam 5.3

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.