Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Icepick.pt

Parsing atípico de uma string

Mensagens Recomendadas

Icepick.pt

Estou a trabalhar com uma base de dados onde cada registo tem um campo genérico onde foram inseridos dados conforme se segue:

"

... bla, bla bla

--- inicio dadosPessoais ---

nome: Icepick

numero de associado: 48574587

data de registo: 01-01-2012

--- fim dadosPessoais ---

mais bla, mais bla, mais bla .....

"

Esta inscrição não ocorre em todos os registos, apenas em alguns.

O que eu quero é varrer a base de dados, e extrair o que está entre as tags nos registos em que a ocorrência existe. Depois de extraída a substring consigo parti-la aos bocados e retirar os dados, porque a gravação foi normalizada. Não consigo é isolar a string, no meio de todo o campo de texto. Alguém me sabe explicar como fazer isso?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Boas,

não pego em PHP ha algum tempo, mas poderá ser algo deste tipo:

- Para facilitar, guardas numa variável, o texto de inicio e fim que precisas

$textoInicio = "--- inicio dadosPessoais";
$textoFim = "--- fim dadosPessoais ---"; 

- Les os registos da BD que contem essa informação

"SELECT campo FROM tabela WHERE campo LIKE '%".$textoInicio."%'"

- Passas por todos os registos resultantes

- Procuras o inicio dos dados no campo, usando o strpos

$posInicio = strrpos($linha["campo"], $textoInicio); 

- Caso encontre (e deve encontrar), guardas o texto apos a tag inicial

$texto=substr($linha["campo"], $posInicio+strlen($textoInicio)+1); 

- Procuras a tag final

$posFinal = strrpos($texto, $textoFim); 

- Caso encontre, retiras do final

$texto=substr($texto, 0, $posFinal); 

- Com o texto final, explodes dividindo o texto pela mudança de linha

$linhas = explode("\n", $texto); 

- Passas por cada linha

foreach ($linhas as $linha)

- E divides o campo e valor pelo caracter ":"

$parametros = explode(":", $linha); 

- Acedes ao parametro usando $parametros[0] e valor usando $parametros[1]

Editado por nelsonr

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

<?php
$sql = "select id, campo
         from tabela
        where campo like '%--- inicio dadosPessoais ---%--- fim dadosPessoais ---&'";

// ler o registo com o método/biblioteca que usas
$record = ...;

$pattern = '/';                                     // início do pattern
$pattern.= '--- inicio dadosPessoais ---';          // início do registo
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= 'nome:';                                 // ler/ignorar o texto 'nome:'
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= '(?P<nome>(.*))';                        // ler a palavra e guardar com o nome 'nome'
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= 'numero de associado:';                  // ler/ignorar o texto 'numero de associado:'
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= '(?P<numero>(.*))';                      // ler a palavra e guardar com o nome 'numero'
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= 'data de registo:';                      // ler/ignorar o texto 'data de registo:'
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= '(?P<data>(.*))';                        // ler a palavra e guardar com o nome 'data'
$pattern.= '[\s]*';                                 // ignorar espaços
$pattern.= '--- fim dadosPessoais ---';             // fim do registo
$pattern.= '/i';                                    // fim do pattern (case-insensitive)

$offset = 0;
while ($offset >= 0) {
   $match = array();
   if (preg_match($pattern, $record['campo'], $match, 0, $offset)) {
       echo "nome : {$match['nome']}\n";
       echo "numero : {$match['numero']}\n";
       echo "data de nascimento : {$match['data']}\n";

       $offset = strpos($record['campo'], $match[0], $offset) + strlen($match[0]);
   } else {
       $offset = -1;
   }
}
?>

ps : corrigido

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.