Ir para conteúdo

POWERED BY:

Arquivado

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

Alessandro Souza

Strpos e Substr

Recommended Posts

Olá, bom dia galera!

Estou com o seguinte problema e gostaria de uma ajudinha de vocês.

 

Eu preciso encontrar em um código fonte alguns dados, por exemplo o bairro, veja:

 

#BAIRRO

$bairro = "<td class='label'>Bairro:</td>";

$posicaoBairro = strpos($file_contents, $bairro); <!-- aqui ele encontra a posicao do bairro -->

$txtBairro = trim(substr($file_contents, $posicaoBairro+55, 35));<!-- aqui ele pega o valor do bairro-->

 

echo $txtBairro."<br>";

 

Queria que no valor do bairro ele encontrasse , e parasse de pegar as substr quando ele encontrar tal ocorrencia como por exemplo o começo de outro campo ex: <td class='label'>Endereco</td>.

Os nomes de bairro e endereço variam entao setando na mão a quantidade de susbtr vai dar erro..

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se eu entendi,

Você quer pegar o bairro se não houver endereço, e quer pegar endereço, se não houver bairro ?

 

Eu acho que o amigo Léo Teixeira tem razão , mais eu não sei muito bem usar expressão regular.

Então deixa eu explicar você. Eu preciso capturar dados dentro do codigo fonte.. eu acho a string endereço dentro do codigo e quero capturar o valor de endereço, mais o endereço tem valor variado. tem 100 strings, 200, 50 entao eu nao posso delimitar a substring pois dará erro. Eu preciso usar um esquema que quando ele encontre um outro campo ele interrompe e para de pegar os dados do bairro por exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, e esses dados vem de um site .. ? talvez você possa utilizar uma biblioteca mais apropriada ..

 

Sim , é o site de um setor da empresa onde eu trabalho , mais esse setor não libera o acesso de forma alguma, então como estou fazendo , é um pouco ardiloso mais fazer o que..

Eu abro o relatorio com CURL e e vou pegar essas informacoes por ae para salva no meu banco de dados.. Eu consigo capturar , mais como uso substr , as vezes ele corta um nome , um endereço.. pois nem sempre são iguais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode informar o link para eu dar uma olhada ?

 

Me desculpe, mais não é nem um site remoto ele é local aqui da empresa. mais vou colar aqui para voce ver.

 

<tr>

<td class='label'>Seguimento:</td>

<td class='content'>Internet</td>

<td class='label'>Problema:</td>

<td colspan='3' class='content'>CM não loca</td>

<td class='label'>Cabo:</td>

<td class='content'>Coaxial</td>

</tr><tr>

<td class='label'>Bairro:</td>

<td class='content'>Cursino</td>

<td class='label'>Endereco:</td>

<td colspan='5' class='content'>R: NOSSA SENHORA DA SAÚDE, 622 - CASA 07. SI@ - 2021077</td>

</tr>

 

FUNCAO TESTE PHP

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,'$URL');

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

curl_setopt($ch, CURLOPT_USERPWD, "XXXX:XXXXX");

curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);

curl_exec($ch);

curl_close($ch);

ob_start();

ob_end_clean();

 

$file_contents = ob_get_contents();

 

#BAIRRO

$bairro = "<td class='label'>Bairro:</td>";

$posicaoBairro = strpos($file_contents, $bairro);

$txtBairro = trim(substr($file_contents, $posicaoBairro+55, 35)); -- eu queria pegar automatico sem setar o tamaho da substr

echo $txtBairro."<br>";

 

#ENDERECO

$endereco = "<td class='label'>Endereco:</td>";

$posicaoEndereco = strpos($file_contents, $endereco);

$txtEndereco = trim(substr($file_contents, $posicaoEndereco+69, 44));

echo $txtEndereco."<br>";

 

 

 

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O texto que você quer pegar seria esse do exemplo?

 

<td class='label'>Bairro:</td>

 

No caso a palavra "Bairro:" dentro das tags td?

 

EDIT:

 

Agora vi que postou o código completo, no código abaixo você gostaria de pegar a palavra "Cursino", certo?

 

<td class='content'>Cursino</td>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O texto que você quer pegar seria esse do exemplo?

 

<td class='label'>Bairro:</td>

 

No caso a palavra "Bairro:" dentro das tags td?

 

 

Entao como as tags que possuem o valor do bairro, endereco, etc são iguais, eu primeiro encontro a posicao do <td class='label'>Bairro:</td>, na frente disso possue <td class='content'>VALOR DO BAIRRO</td> = EU QUERO ESSE VALOR

 

O texto que você quer pegar seria esse do exemplo?

 

<td class='label'>Bairro:</td>

 

No caso a palavra "Bairro:" dentro das tags td?

 

EDIT:

 

Agora vi que postou o código completo, no código abaixo você gostaria de pegar a palavra "Cursino", certo?

 

<td class='content'>Cursino</td>

EDIT

ISSO CARA!!!!

 

Gente me ajudem por favor..

 

NInguem pode me ajudar?????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu não gosto muito de entregar o código pronto, primeiro que este não é o meu trabalho e segundo que sou a favor que a pessoa estude e aprenda para saber o que está fazendo e saiba se virar quando precisar novamente da mesma coisa.

 

Mas como estou com um tempo livre aqui e vi que você não entende muito de REGEX, resolvi ajudar.

 

Aí vai o código:

 

<?php

$conteudo = "<tr>
	<td class='label'>Seguimento:</td>
	<td class='content'>Internet</td>
	<td class='label'>Problema:</td>
	<td colspan='3' class='content'>CM não loca</td>
	<td class='label'>Cabo:</td>
	<td class='content'>Coaxial</td>
</tr><tr>
	<td class='label'>Bairro:</td>
	<td class='content'>Cursino</td>
	<td class='label'>Endereco:</td>
	<td colspan='5' class='content'>R: NOSSA SENHORA DA SAÚDE, 622 - CASA 07. SI@ - 2021077</td>
</tr>";


// Remove formatações, quebras de linha e tabulação
$conteudo = preg_replace('/[\f\n\t]+/', '', $conteudo);

// Pega o bairro
preg_match('/<td class=\'label\'>Bairro:<\/td><td class=\'content\'>([\w\d\s]+)<\/td>/', $conteudo, $matches);
$bairro = $matches[1];

// Pega o endereço
preg_match('/<td class=\'label\'>Endereco:<\/td><td colspan=\'5\' class=\'content\'>(.+)<\/td>/', $conteudo, $matches);
$endereco = $matches[1];

echo '<strong>Bairro:</strong> ' . $bairro . '<br />' . PHP_EOL;
echo '<strong>Endereço:</strong> ' . $endereco . '<br />' . PHP_EOL;

 

 

Saída:

 

Bairro: Cursino

Endereço: R: NOSSA SENHORA DA SAÚDE, 622 - CASA 07. SI@ - 2021077

 

Qualquer dúvida posta aí. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui para mim da alguns erros , acho que de array vazio .

 

Notice: Undefined offset: 1 in C:\wamp\www\home\curl.php on line 36

 

Notice: Undefined offset: 1 in C:\wamp\www\home\curl.php on line 40

Bairro:

Endereço:

 

 

o que pode ser?

 

 

E OBRIGADO POR AJUDAR CARA, VALEW MESMO!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, a ER não está casando aí. Você está testando com esse código que eu passei ou fez alguma alteração?

 

Verifique a codificação, pois o "Endereço:" está aparecendo como "Endereço:" aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

To testando a mesma coisa.. Setei o Charset como UTF8 para resolver a codificacao..

Veja:

<?php
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
$conteudo = "<tr>
               <td class='label'>Seguimento:</td>
               <td class='content'>Internet</td>
               <td class='label'>Problema:</td>
               <td colspan='3' class='content'>CM não loca</td>
               <td class='label'>Cabo:</td>
               <td class='content'>Coaxial</td>
       </tr><tr>
               <td class='label'>Bairro:</td>
               <td class='content'>Cursino</td>
               <td class='label'>Endereco:</td>
               <td colspan='5' class='content'>R: NOSSA SENHORA DA SAÚDE, 622 - CASA 07. SI@ - 2021077</td>
       </tr>";


// Remove formatações, quebras de linha e tabulação
$conteudo = preg_replace('/[\f\n\t]+/', '', $conteudo);
// Pega o bairro
preg_match('/<td class=\'label\'>Bairro:<\/td><td class=\'content\'>([\w\d\s]+)(.+)<\/td>/', $conteudo, $matches);
$bairro = $matches[1];

// Pega o endereço
preg_match('/<td class=\'label\'>Endereco:<\/td><td colspan=\'5\' class=\'content\'>(.+)<\/td>/', $conteudo, $matches);
$endereco = $matches[1];

echo '<strong>Bairro:</strong> ' . $bairro . '<br />' . PHP_EOL;
echo '<strong>Endereço:</strong> ' . $endereco . '<br />' . PHP_EOL;
?>

Existe alguma configuraca no php? Alguma extensao? Versão? To usando o WAMP!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma dica, quando for postar código no fórum use o bbcode [ code ], assim não perde a formatação e fica mais fácil de analisar o código.

 

Se você usou o mesmo código que eu passei deveria funcionar, pois eu testei aqui e funcionou.

 

De acordo com o manual a biblioteca PCRE vem disponível como padrão desde o PHP 4.2.0, mas pode ser que esteja desabilitada aí. Dá uma olhada lá :seta: http://br.php.net/manual/pt_BR/pcre.installation.php

 

Você está usando o primeiro código que eu postei, eu fiz uma pequena correção logo em seguida mas que não deve alterar em nada no funcionamento. Troque esta linha:

 

preg_match('/<td class=\'label\'>Bairro:<\/td><td  class=\'content\'>([\w\d\s]+)(.+)<\/td>/', $conteudo,  $matches);

 

Por esta:

 

preg_match('/<td class=\'label\'>Bairro:<\/td><td class=\'content\'>([\w\d\s]+)<\/td>/', $conteudo, $matches);

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.