Icepick.pt Posted May 13, 2013 at 07:14 AM Report #507060 Posted May 13, 2013 at 07:14 AM 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?
nelsonr Posted May 13, 2013 at 08:52 AM Report #507064 Posted May 13, 2013 at 08:52 AM (edited) 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 May 13, 2013 at 10:20 AM by nelsonr
HappyHippyHippo Posted May 13, 2013 at 09:01 AM Report #507065 Posted May 13, 2013 at 09:01 AM (edited) <?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 May 13, 2013 at 09:37 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now