2010-08-16 2 views
0

мне нужно, чтобы иметь возможность анализировать такого рода данных в PHP:Нужна помощь разборе некоторые данные в PHP

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

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

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

Как вы можете видеть данные в значительной степени случайным образом. Единственное, что остается неизменным, - это -----, разделяющее каждую запись и бит Acct: 1. Заполнение между каждым : часто изменяется, как и переменная, представляющая каждый бит данных.

Я пробовал пройти и разбирать все это самостоятельно, используя регулярное выражение, но я недостаточно квалифицирован, чтобы быть в состоянии сделать это правильно. В конце этого я хочу получить данные по следующему адресу:

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

Если это имеет смысл вообще. Это не должно быть таким эффектным, поскольку мне нужно будет делать это примерно раз в день, и я не возражаю ждать, как долго он понадобится.

спасибо. :)

Edit: Это то, что я сам по себе:

<?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; 
} 

?> 

я добрался до извлечения Acct: части, но ничего кроме этого я просто не могу получить мою голову вокруг.

+1

Это помогает, если вы покажете, что вы сделали до сих пор. Люди больше готовы помочь, если вы можете показать им свои усилия. –

+0

Ах, конечно. Я отредактирую свой ОП. – Kratz

+0

Если строки тире будут содержать только три штриха, т. Е. '---', тогда это будет [YAML] (http://yaml.org) – Joey

ответ

1

Этот фрагмент кода будет принимать все введенные данные и произвести ассоциативный массив для каждой записи в входе:

// 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: Я только что смотреть на код, который вы публикуемую. Вам действительно не нужны регулярные выражения для того, что вы пытаетесь сделать. Regex может быть очень удобно при использовании в нужном месте, но большую часть времени это неправильная вещь.

+0

Отлично, спасибо. Только проблема у меня есть, иногда у учетной записи есть URL, например, 'http: // google.com', который ваш блок кода взрывается, тем самым делая вывод странным. Но я могу, скорее всего, исправить это сам. Спасибо! :) – Kratz

+0

Вы можете передать предельный параметр 'explode', просто сделайте его' explode (':', $ line, 2) ', и он разделит его только на 2 части. – casablanca