Ir para conteúdo

POWERED BY:

Arquivado

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

lucasdidur

[Resolvido] Erro com o preg_match

Recommended Posts

Olá pessoal, estou com um problema com o preg_match, ele não esta funcionando direito.

 

Tenho uma pagina do GameVicio

 

<div class="item"><a href="http://www.gamevicio.com.br/i/requisitos/1/1283-company-of-heroes-para-pc/index.html">Requisitos de sistema</a></div>

E eu queria copiar o link 'http://www.gamevicio.com.br/i/requisitos/1/1283-company-of-heroes-para-pc/index.html' de lá, só que esta dando erro, o que sera que é?

 

preg_match('/<\/div><div class="item"><a href="(.*?)">Requisitos de sistema/',$paginaGV,$matches3);

A pagina é essa http://www.gamevicio.com.br/i/perfil/1/1283-1-company-of-heroes-para-pc/index.html

 

Será que alguém sabe ligar com isso? É tão complicado assim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$str = '<div class="item"><a href="http://www.gamevicio.com.br/i/requisitos/1/1283-company-of-heroes-para-pc/index.html">Requisitos de sistema</a></div>';

preg_match('/<div class="item"><a href="([a-zA-Z0-9:\/._-]+)">Requisitos de sistema<\/a><\/div>/',$str,$matches3);

echo $matches3[1];
?>

Resultado: http://haxor.com.br/imasters/preg_match_url.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá funcionou, valeu, mais estou com um outro probleminha aqui: Tem a pagina do Baixaki Jogos, e tem a descrição do jogo, estou tentando copiar mais não esta dando certo, esta dando uma array vazia.

 

 

// Pega o HTML
$str = $CodeAuto->getSourceHTML( 'http://www.baixakijogos.com.br/pc/company-of-heroes' );

preg_match('/<div class="text">(.*?)<\/div>/',$str,$matches);

O que será que esta dando errado?

 

 

O André perguntou

HAXOR, e se a variável $str for:

 

$str = file_get_contents( 'http://www.gamevicio.com.br/i/perfil/1/1283-1-company-of-heroes-para-pc/index.html' );

 

 

funciona?

Usando o file_get_contents no gamevicio não da Porque a Página vem compactada, dai tem que usar uma outra função para descompactar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre a codificação do retorno, é GZIP, que acelera e muito o carregamento da página.

 

Você pode decodificar assim:

 

header('Content-Type: text/html; charset=iso-8859-8'); 

$str = file_get_contents( 'http-~~-//www.gamevicio.com.br/i/perfil/1/1283-1-company-of-heroes-para-pc/index.html' );

print gzdecode( $str );

O header() foi para adequar a saída com a codificação de caracteres que o site usa (ISO-8859-8 ao invés de UTF-8)

 

Se por algum caso bizarro que você não saiba o script acusar chamada à função indefinida para gzdecode(), pode usar essa alternativa (manual).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então tem alguma coisa errada aqui ?

 

// Pega o HTML
$str = $CodeAuto->getSourceHTML( 'http://www.baixakijogos.com.br/pc/company-of-heroes' );

preg_match('/<div class="text">(.*?)<\/div>/',$str,$matches);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou dizendo isso: $CodeAuto->getSourceHTML();

 

A sim. O código é esse. ele estava na classe mas agora eu passe para uma função normal.

 

	// Obten o Código HTML
	function getSourceHTML($Page){
		
		$host = get_headers($Page, 1);
		
		
		if($host['Content-Encoding'] == "gzip"){
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $Page);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			$PageGZ = curl_exec($ch);
			curl_close($ch);
			
			$PageHTML = gzdecode($PageGZ);
			
		}else{
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $Page);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			$PageHTML = curl_exec($ch);
			curl_close($ch);
				
		}
		return $PageHTML;
	
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, é um simples wrapper para requisitar a página via GET.

 

Primeiro: Você REALMENTE tem necessidade de usar cURL? Se seu servidor tiver a diretiva allow_url_fopen habilitada, pode fazer direto com file_get_contents() como demonstrei.

 

Segundo: Se de fato você precisa de cURL, pra que repetir isso:

 

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Page);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$PageGZ = curl_exec($ch);
curl_close($ch);

Duas vezes? Você executa uma vez só, fora do IF, depois que executou a requisição você verifica o cabeçalho e decodifica ou não.

 

Terceiro: Você tem certeza sobre a marcação que está tendo analizar? Dei uma olhada rápida no source da página e não encontrei nenhuma referência àuma DIV com CLASS "text" (sem aspas).

 

A julgar pelo primeiropost, você aparenta ter se equivocado, já que inicia a discussão com uma DIV de CLASS "item"

 

Re-analisando o source em busca dessa tag, encontra-se várias ocorrências, logo,ao invés de usar preg_match(), você deveria usar preg_match_all()

 

Porém, justamente por haver diversas ocorrências, uma ER genérica como a última passada ( a do .*? ) vai te retornar uma matriz com muitas entradas.

 

Então, eu te sugiro das duas uma: Ou fazer uma ER mais específica ou usar DOM.

 

Mas, uma ER muito específica pode vir atrelada à um revés, que é o aumento proporcional ou exponencial da complexidade da ER.

 

Com a DOM, apesar de ter uma sintaxe um pouco mais complicada, o código fica menor, mais legível e de manutenção ágil,para o caso de haver algum update na estrutura do layout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta certo, eu ainda não sou um profissional da programação, e nen sei lidar muito com ER. Eu não sei se você leu, mais eu disse que a Primeira coisa que eu tinha perguntado, Funcionou, então resolvi perguntar outra no mesmo post.

 

Eu uso o cURL, pois não é todos os sites que permite usar o file_get_contents(), então decidi usar todos assim.

 

A Primeira vez que eu escrevi era referente ao site do GAME VICIO e o segundo é referente ao BAIXAKI JOGOS, creio que você procurou no GameVicio, pois o de class='item' é do GameVicio, e do do class='text' é do Baixaki jogos. Olha um trecho aqui

 

<div class="text"> 
      <p><font face="verdana,geneva" size="2">Company of Heroes foi considerado pela crítica o melhor jogo de estratégia em tempo real lançado em 2006. Através da temática baseada na Segunda Guerra Mundial, sem dúvida eternamente atraente, o jogo se destacou pelos gráficos exuberantes, ótima jogabilidade e sons de dar inveja. Com tanta qualidade, ganhou inúmeros prêmios e obteve ...
      </p></font>
</div>

O código final ficou assim.

 

// Obten o Código HTML
function getSourceHTML($Page){
	
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $Page);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$PageHTML = curl_exec($ch);
	curl_close($ch);
	
	$host = get_headers($Page, 1);	
		
	if($host['Content-Encoding'] == "gzip")
		$PageHTML = gzdecode($PageGZ);	
	
	return $PageHTML;
}

Eu já usava o DOM, mais as vezes dava um erro para pegar o HTML, e não dava no pegar o valor. A função que eu criei para pegar o HTML é essa com a ajuda do André D. Molin.

 

function getHTML ($Pagina,$Expressao,$Item = 0){ 

	$dom = new DOMDocument; 
	@$dom->loadHTML( $Pagina );
	$xpath = new DOMXPath( $dom ); 
	
	$conteudo = $xpath->query( $Expressao )->item( $Item ); 
	
	$tmp_doc = new DOMDocument(); 
	$tmp_doc->appendChild($tmp_doc->importNode($conteudo,true)); 
	$innerHTML = $tmp_doc->saveHTML();
	return $innerHTML;
}

Por isso que eu decidi mudar o código pra ER, mais eu ainda não aprendi a usar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu uso o cURL, pois não é todos os sites que permite usar o file_get_contents(), então decidi usar todos assim.

Como é? Sites (ou servidores) que não aceitam uma requisição GET/POST realizada com cURL?

 

Teria um exemplo de uma dessas "peças raras"?

 

A Primeira vez que eu escrevi era referente ao site do GAME VICIO e o segundo é referente ao BAIXAKI JOGOS

Ooops... ^_^

 

Sobre essa função wrapper para DOM, eu manteria separado, num classe, um método para cada tarefa: conectar ao site, analisar o conteúdo, montar o retorno...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teria um exemplo de uma dessas "peças raras"?

 

Eu tentei uma vês com o GameTrailers, usando o file_get_contents() e não aparecia nd, dai usei o cURL e funcionou.

 

Sobre essa função wrapper para DOM, eu manteria separado, num classe, um método para cada tarefa: conectar ao site, analisar o conteúdo, montar o retorno...

 

Sobre conectar ao Site eu tenho. 'analisar o conteúdo' e 'montar o retorno' eu nun entendi. Pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conexão = cURL, file_get_contents(), gzdecode...

 

Analisar o conteúdo = DOM, funções de ER (para não listar todas)

 

Retorno = Por organização apenas, você pode, separar aquilo que a ação anterior analisou, da forma como você vai manipular depois.

 

Seria uma etapa em que as informações deixariam de estar nas variáveis "temporárias" da etapa anterior, para se organizarem numa estrutura definitiva.

 

Entendeu? Porque senão, se uma única função/método quiser abraçar o mundo, quando você precisar fazer alguma alteração pode demorar mais do que o necessário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conexão = cURL, file_get_contents(), gzdecode...

 

Analisar o conteúdo = DOM, funções de ER (para não listar todas)

 

Retorno = Por organização apenas, você pode, separar aquilo que a ação anterior analisou, da forma como você vai manipular depois.

 

Seria uma etapa em que as informações deixariam de estar nas variáveis "temporárias" da etapa anterior, para se organizarem numa estrutura definitiva.

 

Entendeu? Porque senão, se uma única função/método quiser abraçar o mundo, quando você precisar fazer alguma alteração pode demorar mais do que o necessário.

 

Entendi, valeu mesmo :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estarei marcando como Resolvido então. Qualquer coisa, envie-nos (qualquer um da Staff) que revertemos o estado.

 

Bons estudos. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.