Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
Agradeço sua intenção, mas esqueci de mencionar que essa parte "8,031 KB | 2010-03-09 | ZIP File" é dinâmico, ou seja mudar sempre, conforme a requisição.
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.
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>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).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>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.
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](http://www.sitequalquer.com.br)" class="teste">teste</a>
1,2 MB | 2012-06-16 | PDF File</p>
</div>
Mesmo assim é possível?
>
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](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.
Olá espiculo, não podemos fixar essa string porque ela muda sempre.
>
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 arquivoO que eu quero dizer que esse trecho "2.222,2 MB | 2010-03-09 | Imagem" é dinamico, muda a cada requisição.
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.
Quase deu certo, mas ele tá pegando o nome da div que colocamos no array e não do arquivo atual, veja ai:
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.
Sim as DIV são diferentes eu coloquei aqui no fórum como teste, mas para ver as reais segue esse link:
http://4shared.tectonny.com/home.php
E pesquise por "<div class="fileDescription floatLeft">" que vai até fechar a DIV.
Lembrando que os dados muda o tempo todo.
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.
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 ) ) );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
Eu já tinha:
error_reporting(__ALL__);
Coloquei o que você indicou e mostra o erro, veja...
--------------- Ponto de Mesclagem ---------------
Notice: Undefined variable: matches in /home/antonio/public_html/4shared/down.php on line 163
string(0) ""
Amigo, por favor, preste atenção naquilo que está sendo postado.
Onde que isso:
error_reporting(__ALL__);
É o mesmo que isso:
error_reporting( E_ALL );
E mais. Essa configuração apenas define o nível de alerta.
Se a diretiva display_errors do PHP.INI estiver Off de nada adianta.
Isso é parte do problema. Pelo menos agora você está vendo o erro. Mas você leu meu último post até o fim?
Nele eu explico o motivo desse Notic estar sendo disparado.
Ok, mas eu modifiquei para error_reporting( E_ALL | E_STRICT ); já que aqui é 5.3.
Mas valeu pelas dicas... Vou tentando aqui sozinho.
Mas você não tem que tentar, cara.
A resposta está pronta, é só ler e compreender.
>
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:
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.