Jump to content
Icepick.pt

Parsing atípico de uma string

Recommended Posts

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?

Share this post


Link to post
Share on other 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]

Edited by nelsonr

Share this post


Link to post
Share on other 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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.