2013-08-01 27 views
3

我有一个文本文件,它是我想要变成数组的目录列表。我想空间分隔可以工作,但每个项目之间的空格数量不同,而目录名称中的空格将会成为问题。我想将文本解析为一个PHP数组。从空格分隔的文本文件创建一个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

当然,使用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

+0

这是伟大的,但我仍然需要(年)成为一个单独的数组条目。我相信这很容易修改。 – Beatmstrj

+0

@ user2640227好吧,我改变了那个代码 –

+0

优秀。这是完美的,谢谢! – Beatmstrj

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++; 
} 
+0

因为我需要扫描的目录不在运行php的服务器上。该文件在本地创建,然后上传到服务器,它有PHP。否则,这将是一个相当简单的解决方案! – 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'; 
相关问题