2010-08-16 8 views
0

que je dois être capable d'analyser ce type de données en PHP:Besoin d'aide pour l'analyse des données en PHP

Acct: 1 
email  : [email protected] 
status  : online 
-------------------------------------------------- 

Acct: 2 
email  : [email protected]  
status  : banned 
-------------------------------------------------- 

Acct: 3 
signedupname : SomeUsername  
somethingelse : offline 
-------------------------------------------------- 

Comme vous pouvez voir les données est en grande partie aléatoire. La seule chose qui reste la même est la ----- séparant chaque entrée et les bits Acct: 1. Le remplissage entre chaque : change souvent tout comme la variable pour représenter chaque bit de données.

J'ai essayé de passer en revue et d'analyser tout cela moi-même en utilisant regex mais je ne suis pas assez habile pour être capable de le faire correctement. A la fin de ce que je veux des données selon les critères suivants:

Acct: <integer> 
var1: <string> 
var2: <string> 

Si cela n'a aucun sens. Il n'a pas besoin d'être aussi efficace, car j'aurai besoin de faire cela une fois par jour et cela ne me dérange pas d'attendre le temps dont il a besoin.

Merci. :)

Edit: Voici ce que je l'ai fait moi-même:

<?php 

$data = file_get_contents('records.txt'); 
$data = explode('******** Saved Host list with acct/variables ********', $data); 
$data = explode('--------------------------------------------------', $data[1]); 

foreach($data as &$dataz) 
{ 
    $dataz = trim($dataz); 
} 

$data = str_replace('Acct:', "\nAcct:", $data); 

foreach($data as $dataz) 
{ 
    preg_match('/Acct: (.*)/', $dataz, $match); 
    $acct = $match[1]; 
    preg_match('/: (.*)/', $dataz, $match); 
    $var1 = $match[1]; 
    echo $var1; 
} 

?> 

J'obtenu aussi loin que l'extraction de la Acct: partie, mais au-delà de tout ce que je ne peux tout simplement pas obtenir ma tête.

+1

Cela aide si vous montrez ce que vous avez fait jusqu'à présent. Les gens sont plus disposés à aider si vous pouvez leur montrer votre effort. –

+0

Ah bien sûr. Je vais éditer mon OP. – Kratz

+0

Si les lignes de tirets ne contiennent que trois tirets, c'est-à-dire '---', alors ce sera valide [YAML] (http://yaml.org) – Joey

Répondre

1

Ce morceau de code prendra votre entrée entière et produire un tableau associatif pour chaque enregistrement dans votre entrée:

// replace ----- with actual number of dashes 
foreach (explode('-----', $input) as $entry) { 
    $entry = trim($entry); 
    $record = array(); 
    foreach (explode("\n", $entry) as $line) { 
    $parts = explode(':', $line); 
    $varname = trim($parts[0]); 
    $value = trim($parts[1]); 
    $record[$varname] = $value; 
    } 
    // Do anything you want with $record here 
} 

Edit: Je viens d'avoir un regard sur le code affiché. Vous n'avez vraiment pas besoin d'expressions régulières pour ce que vous essayez de faire. Regex peut être très pratique lorsqu'il est utilisé au bon endroit, mais la plupart du temps, ce n'est pas la bonne chose à utiliser.

+0

Excellent, merci. Le seul problème que j'ai est parfois le compte a une URL par exemple 'http: // google.com', que votre bloc de code explose en rendant ainsi la sortie bizarre. Mais je peux plus que probablement résoudre cela moi-même. Merci beaucoup! :) – Kratz

+0

Vous pouvez passer un paramètre de limite à 'explode', juste le faire' explode (':', $ line, 2) 'et il ne le divisera qu'en 2 parties. – casablanca