【问题标题】:Need help parsing some data in PHP需要帮助在 PHP 中解析一些数据
【发布时间】:2011-03-30 17:11:00
【问题描述】:

我需要能够在 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: 部分,但除此之外的任何内容我都无法理解。

【问题讨论】:

  • 如果你能展示你到目前为止所做的事情会很有帮助。如果你能向他们展示你的努力,人们会更愿意提供帮助。
  • 啊当然。我将编辑我的 OP。
  • 如果破折号的行只包含三个破折号,即---,那么它就是有效的YAML

标签: php regex parsing explode


【解决方案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
}

编辑:我刚刚看了你发布的代码。你真的不需要正则表达式来做你想做的事情。正则表达式在正确的地方使用时非常方便,但大多数时候,它不是正确的使用方法。

【讨论】:

  • 太好了,谢谢。我唯一的问题是有时该帐户有一个 URL,例如 http://google.com,您的代码块会爆炸,从而使输出变得奇怪。但我很有可能自己解决这个问题。谢谢! :)
  • 您可以将限制参数传递给explode,只需将其设为explode(':', $line, 2),它只会将其分成两部分。
猜你喜欢
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多