Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

expressão regular, pegar um trechinho :)

Recommended Posts

Fala moçada bonita,

 

Eu tenho um cliente que possui no seu sistema uma consulta a diversos tribunais de justiça do brasil. Pois bem, o que o sistema faz na verdade é trazer o conteúdo de uma página (ex: http://www.tj.pr.gov.br/internet/csp/juizadocivel/BuscaDados2004p.csp?Processo=200500048415&Comarca=1) e organiza no meu layout.

 

Só que está acontecendo um problema. Hoje ao usar expressões regulares para encontrar algumas informações, ele está trazendo errado... ao invés de trazer "6º Juizado Especial Cível", está trazendo "TIPO", que está um pouco a frente.

 

Porém, eu não manjo NADEGAS de expressões regulares, e queria uma força, se possível.

 

Código:

// * Recuperando a vara do processo
$_retorno = substr($_retorno, strpos($_retorno, 'JUIZADO'));
		
// * Recupera o texto referente à vara
preg_match('/>[\w\s\/\[\]\(\){}|!"\':;.,#$%=+*-]+<\/span>/i', $_retorno, $captura);

 

Ao que entendi, ele encontra em $retorno (que traz toda a página) onde está a palavra JUIZADO, e logo após, vê onde fecha o <span> e remove daí pra frente. Após isso, grava em $captura. Mas está removendo no lugar errado, hehe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,

 

Encontrei o erro, na verdade o problema é que na frase "6º Juizado Especial Cível" tem o i com acento, isso ta trazendo problema, você terá que incluir as letras com acento na expressão regular, lembrando que ele diferencia maiúsculo de minusculo.

 

Dessa forma:

/>[\w\s\/\[\]\(\){}|!"\':;.,#$%=+âÂíÍêÊôÔû*-]+<\/span>/i

 

Coloquei algumas letras com acento, completa com as restantes Áá..

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Jonathan, beleza? Obrigado pela resposta!

 

Entendi... mas fiz o teste aqui e não deu certo, continuou trazendo a string errada.

 

        // * Recupera o texto referente à vara
        //preg_match('/>[\w\s\/\[\]\(\){}|!"\':;.,#$%=+*-]+<\/span>/i', $_retorno, $captura);
	preg_match('/>[\w\s\/\[\]\(\){}|!"\':;.,#$%=+âÂíÍêÊôÔû*-]+<\/span>/i', $_retorno, $captura);
		
        // * Verifica se o texto foi encontrado
        if (!empty($captura[0]))
        {
            // * Retira o HTML
            $vara = str_replace('>', '', $captura[0]);
            $vara = str_replace('</span>', '', $vara);           
            $processo['vara'] = trim($vara);
        }
        else 
        {
            $processo['vara'] = 'Sem dados';
        }

Está retornando TIPO ao invés de "6º Juizado Especial Cível" ainda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara, a variável $retorno traz toda a página (com cabeçalhos, body, html e tudo mais), ou seja, o código-fonte disso aqui:

 

http://www.tj.pr.gov.br/internet/csp/juizadocivel/BuscaDados2004p.csp?Processo=200500048415&Comarca=1

 

Mas será que realmente pode ser algum problema de encode?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Evandro não sei te dizer. A principio acho que não deveria ser o problema de charset, já que ele teria que buscar o final da tag span e me trazer o conteúdo alí.

 

@Ricardo Não tem como fazer apenas modificando minha expressão regular? Pq senão vai ter muito impacto no sistema do cliente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não era nem questão de charset. Como já foi dito anteriormente, REGEX'es também levam em questão acentuação.

 

[inline]/a/[/inline] é diferente de [inline]/á/[/inline].

 

Você precisa só dessa informação?? Porque se for só isso, acho que você complicou demais a regex sem necessidade.

preg_match('@<span class="NOTICIAS">(.*?)</span>@i', $_retorno, $captura);

Se precisar trabalhar os outros campos dessa mesma estrutura, pode trocar por

preg_match('@<span class="[A-Z]">(.*?)</span>@i', $_retorno, $captura);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não fui eu que construi a função, por isso vim pedir ajuda, hehe. Ela já estava montada quando a bomba caiu no meu pé.

Só que, usando:

 

preg_match('@<span class="NOTICIAS">(.*?)</span>@i', $_retorno, $captura);

Ele não vai pegar todas as spann .noticia? São varias, e gostaria apenas a que tivesse o Juizado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não fui eu que construi a função, por isso vim pedir ajuda, hehe. Ela já estava montada quando a bomba caiu no meu pé.

Só que, usando:

 

 


preg_match('@<span class="NOTICIAS">(.*?)</span>@i', $_retorno, $captura);
Ele não vai pegar todas as spann .noticia? São varias, e gostaria apenas a que tivesse o Juizado.

 

 

Na verdade, tem até um erro, pq vai pegar a primeira ocorrência. Pra pegar todos você precisa usar http://php.net/preg_match_all

 

Se o conteúdo à esquerda for sempre o mesmo, dá pra buscar pelo nome do campo:

@TIPO</span>.*?<span.*?>(.*?)</span>@

Na verdade, com a implementação de regex do PHP, dá pra fazer umas mágicas bem legais. Estou só tentando manter no simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Duas sugestões:

  1. Utilize a flag para multiline e compare os dois itens
  2. Usar preg_match_all, assim você teria todos os dados

Exemplo 1

preg_match("@<SPAN CLASS='NEWS'>JUIZADO</SPAN>.*?<SPAN CLASS='NOTICIAS'>(.*?)</SPAN>@is", $result, $matches);

Exemplo 2

 

$url = 'http://www.tj.pr.gov.br/internet/csp/juizadocivel/BuscaDados2004p.csp?Processo=200500048415&Comarca=1';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

preg_match_all("@<SPAN CLASS='NEWS'>(.*?)</SPAN>@", $result, $titulos);
preg_match_all("@<SPAN CLASS='NOTICIAS'>(.*?)</SPAN>@", $result, $valores);

$keys = array_slice($titulos[1], 0, count($valores[1]));
$result_array = array_combine($keys, $valores[1]);

print_r($result_array);

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha @hufersil, acredito que seu segundo exemplo vai salvar minha vida. Vou testar com mais cautela e ver o impacto de aplicar isso no sistema do cliente. Acredito que com isso, até o código ficaria muito menor do que estava antes (com o antigo programador)... o retorno no array organizado veio MUITO a calhar. Se der certo aqui, já marco seu post como resolvido ;-)

 

OBS: Só uma coisa, ele retornou legal as infos do processo... mas é possível inserir mais chaves no Array? Existem os movimentos do processo, que estão no mesmo padrão de código mas não estão entrando... ah agora que vi que a construção do HTML do TJ está errada... :(

 

<TD width="70%" SPAN CLASS='NOTICIAS'>Remessa - Arquivo Geral</SPAN></TD>

TD e SPAN na mesma tag, hahah que merda!

 

Pensando nisso, vou tentar o seguinte... tenho o código que funcionava antes que trazia a ultima movimentação do processo... e gostaria de inserir no array montado acima, mas não estou sabendo fazer, como posso?

 

$url = 'http://www.tj.pr.gov.br/internet/csp/juizadocivel/BuscaDados2004p.csp?Processo=200500048415&Comarca=1';
 
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
 
preg_match_all("@<SPAN CLASS='NEWS'>(.*?)</SPAN>@", $result, $titulos);
preg_match_all("@<SPAN CLASS='NOTICIAS'>(.*?)</SPAN>@", $result, $valores);

$keys = array_slice($titulos[1], 0, count($valores[1]));
$result_array = array_combine($keys, $valores[1]);

$result_array[] = "MOVIMENTACAO" => "aqui"; // Adicionar ultima movimentação
 
print_r($result_array);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem sim.

 

Uma pequena alteração no segundo preg_match_all e um splice resolvem ;)

preg_match_all("@<SPAN CLASS='NEWS'>(.*?)</SPAN>@", $result, $titulos);
preg_match_all("@<TD.*?CLASS='NOTICIAS'>(.*?)</SPAN>@", $result, $valores);

$keys = array_slice($titulos[1], 0, count($valores[1]));
$result_array = array_combine($keys, $valores[1]);

// separando a movimentação, que começa a partir do 13 elemento (indice 12 no array)
$movimentacao = array_splice($result_array, 12);

print_r($result_array);
print_r($movimentacao);

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Genial! As possibilidades com regex são infinitas! É tudo na base de padrões, muito legal mesmo...

Agora tenho que dar um jeito de exibir sempre a ultima movimentação, haha

Compartilhar este post


Link para o post
Compartilhar em outros sites

para pegar a primeira descrição da lista:

$first = reset($movimentacao);

ultima

$last = end($movimentacao);

e para pegar a data da movimentação atual (onde o ponteiro do array está)

$data = key($movimentacao);

 

ou seja, a ultima movimentacao aparece primeiro na lista, então temos:

 

$utlimaDescricao = reset($movimentacao);
$ultimaData = key($movimentacao);

@braços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, a função que tinha quase 200 linhas foi pra apenas isso no final:

 

private function dadosProcessoJuizado($processo, $_comarca)
    {
		$url = "http://www.tj.pr.gov.br/internet/csp/juizadocivel/BuscaDados2004p.csp?Processo=".$processo."&Comarca=".$_comarca;
		 
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$result = curl_exec($ch);
		curl_close($ch);
		 
		preg_match_all("@<SPAN CLASS='NEWS'>(.*?)</SPAN>@", $result, $titulos);
		preg_match_all("@<TD.*?CLASS='NOTICIAS'>(.*?)</SPAN>@", $result, $valores);
		 
		$keys = array_slice($titulos[1], 0, count($valores[1]));
		$result_array = array_combine($keys, $valores[1]);
		 
		// separando a movimentação, que começa a partir do 13 elemento (indice 12 no array)
		$movimentacao = array_splice($result_array, 12);
		$situacaoProcesso = array_shift($movimentacao); // * Guarda a situação final na variável
		
		$result_array['STATUS'] =  $situacaoProcesso;
		return $result_array;
    }

 

Coisa linda de se ver :natallaugh: . Muito obrigado!

 

Eu usei array_shift para trazer a primeira ocorrência do array... está errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show de bola!

 

Sugiro somente que você teste com outros processos, para garantir que o número de itens no cabeçalho sejam sempre os mesmos, e que você não tenha uma surpresa em pegar um processo onde o cabeçalho seja maior ou menor que este utilizado para testes ;)

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim sim, já fiz o teste com 5 processos diferentes. Aparentemente está OK... vou ver se consigo aplicar a mesma lógica em outros TJ's (outros estados, comarcas), pois só apliquei este código no TJ-PR. Mas agora a bronca é comigo!

 

Fica com Deus! 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.