Нужна помощь в разборе некоторых данных в PHP - PullRequest
0 голосов
/ 17 августа 2010

Мне нужно иметь возможность анализировать данные такого рода в PHP:

 Acct: 1 
 email       : bleh@gmail.com 
 status      : online 
 -------------------------------------------------- 

 Acct: 2 
 email       : dfgg@fgfg.com     
 status      : banned 
 -------------------------------------------------- 

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

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

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

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

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

Спасибо. :)

Редактировать: Это то, что я сделал самостоятельно:

<?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 Ответ

1 голос
/ 17 августа 2010

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

// 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
}

Редактировать: Я только что посмотрел код, который вы опубликовали. Вам действительно не нужны регулярные выражения для того, что вы пытаетесь сделать. Regex может быть очень удобен, когда используется в нужном месте, но в большинстве случаев это не то, что нужно.

...