【问题标题】:How to parse file with PHP如何使用 PHP 解析文件
【发布时间】:2013-01-20 16:45:04
【问题描述】:

我有这个文件,我不知道如何解析这个文件。

type = 10
version = 1.2
PART
{
    part = foobie
    partName = foobie
    EVENTS
    {
        MakeReference
        {
            active = True
        }
    }
    ACTIONS
    {
    }
}
PART
{
    part = bazer
    partName = bazer
}

我希望这是一个看起来像的数组

$array = array(
    'type' => 10,
    'version' => 1.2,
    'PART' => array(
        'part' => 'foobie',
        'partName' => 'foobie,
        'EVENTS' => array(
            'MakeReference' => array(
                'active' => 'True'
            )
        ),
        'ACTIONS' => array(
        )
    ),
    'PART' => array(
        'part' => 'bazer',
        'partName' => 'bazer'
    )
);

我尝试使用 preg_match 但这并不成功。 有什么想法吗?

【问题讨论】:

  • 格式从何而来?为什么不直接使用 PHP 可以读取的格式,例如 JSON、INI、XML 等?
  • 你应该展示你尝试过的东西。没有表现出自己的努力,这真的变成了“请为我写那个解析器”类型的问题。
  • 我突然想到这种格式看起来像 TypoScript(由 TYPO3 使用)。是这样吗?如果是这样,那么您应该查看 TYPO3 的解析器。
  • 数组中不能有 2+ 个相同的键(在您的示例中为 PART)。
  • Sverri,不,它不是打字稿,它实际上是从一个非常旧的 POS 系统导出的文件,应该转换为可以导入到网上商店的东西。但也许实际上可以使用打字稿解析器,我会研究一下,谢谢

标签: php arrays fileparsing


【解决方案1】:

为什么不使用 PHP 可以原生解码的格式,比如 JSON?

http://php.net/json_decode

$json = file_get_contents("filename.txt");
$array = json_decode($json);
print_r($array);

【讨论】:

  • 或许他别无选择?
  • @Gumbo 也许。但他可能有!我们会看到
  • 我不是文件的“所有者”,所以无法更改格式,如果可能的话,我当然会将其更改为 ini、json 或类似格式
【解决方案2】:

这是我的方法。

首先更改我将 { 更改为之前的行。 这很容易

$lines = explode("\r\n", $this->file);
foreach ($lines as $num => $line) {
    if (preg_match('/\{/', $line) === 1) {
       $lines[$num - 1] .= ' {';
       unset($lines[$num]);
    }
}

现在输入看起来像这样

PART {
    part = foobie

现在我们可以将整个事情改为 XML,我知道我在问题中说的是 PHP 数组,但 XML 对象仍然足够好。

foreach ($lines as $line) {
            if (preg_match('/(.*?)\{$/', $line, $matches)) {
                $xml->addElement(trim($matches[1]));
                continue;
            }

            if (preg_match('/\}/', $line)) {
                $xml->endElement();
                continue;
            }

            if (strpos($line, ' = ') !== false) {
                list($key, $value) = explode(' = ', $line);
                $xml->addElementAndContent(trim($key), trim($value));
            }
}

addElement,实际上只是将a添加到字符串中 endElement 添加 a 和 addElementAndContent 两者同时在它们之间添加内容。

只是为了让整个内容成为一个 XML 对象,我正在使用

$xml = simplexml_load_string($xml->getXMLasText());

现在 $xml 是一个 XML 对象,使用起来要容易得多:)

【讨论】:

    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 2010-12-17
    • 2015-10-13
    • 2019-10-02
    • 2012-02-26
    相关资源
    最近更新 更多