从以空格分隔的文本文件创建PHP数组

3
我有一个文本文件,里面是一些目录的列表,我想把它们转换成数组。我觉得用空格分隔符会起作用,但每个项目之间的空格数不同,目录名中的空格也可能会有问题。我想将文本解析为PHP数组。
这个文本文件有一个非常严格的结构,看起来像这样:
04/17/2013  09:49 PM    <DIR>          This is directory 1 (1994)
03/11/2013  06:48 PM    <DIR>          Director 2 (1951)
04/15/2013  08:34 PM    <DIR>          This is going to be number 3 (2000)
08/17/2012  09:50 PM    <DIR>          Four (1998)
10/17/2011  05:12 PM    <DIR>          And lastly 5 (1986)

我只需要保留文件夹的日期(不需要时间),完整目录名称(作为一个条目)和括号内的年份。提前感谢!

3个回答

3
可以使用preg_split函数进行分割:preg_split
<?php
$str = "04/17/2013  09:49 PM    <DIR>          This is directory 1 (1994)
03/11/2013  06:48 PM    <DIR>          Director 2 (1951)
04/15/2013  08:34 PM    <DIR>          This is going to be number 3 (2000)
08/17/2012  09:50 PM    <DIR>          Four (1998)
10/17/2011  05:12 PM    <DIR>          And lastly 5 (1986)";

function sp($x) {
    return preg_split("/\s\s+|\s*\((\d{4}).*\)/", $x,0,PREG_SPLIT_DELIM_CAPTURE);
}
$array = preg_split("/\n/", $str);
$processed = array_map('sp', $array);

print_r($processed);

这将创建一个数组的数组。每一行都将成为一个数组,其中包含每个项目的数组。例如,$processed [0] [3] 将包含 This is directory 1
请注意,此代码假定空格作为分隔符需要2个或更多。只有1个空格被视为同一字段的一部分。(根据您的需求可能需要手动修改) 编辑:我添加了获取年份作为数组的单独元素的部分。现在,$processed [0] [4] 具有 1994。(你不需要 (), 对吧?)
查看此更改的工作方式:http://codepad.org/in973ijV

这很好,但我仍然需要(年份)作为一个单独的数组条目。不过我相信这很容易修改。 - Beatmstrj

0

最简单(易读)的模式是:

$pattern = '~^(?<date>\S+).*<DIR>\s+(?<name>.*) \((?<year>\d{4})\)$~m';
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    printf("<br>date: %s, name: %s, year: %s",
           $match['date'], $match['name'], $match['year']);
}

但你可以更明确地进行一些优化:

$pattern = '~^(?<date>\S++)'                         . '\s++(?:\S++\s++){3}'
         . '(?<name>(?>[^(]++|\((?!\d{4}\)\s*+$))+)' . '\s++\('
         . '(?<year>\d{4})'                          . '\)\s*+$~m';

0

为什么不忘记这个txt,使用scandir呢?

http://php.net/manual/en/function.scandir.php

$mydir = "/home/folder/";
$scan = scandir($mydir);
$i = 2 /* bypass dot and 2dots dirs */;

while($i < count($scan)){
    echo $scan[$i];
    echo "<hr>";
    $i++;
} 

因为我需要扫描的目录不在运行php的服务器上。该文件是在本地创建,然后上传到具有php的服务器上。否则,这将是一个相当简单的解决方案! - Beatmstrj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接