我有一个文本文件,它是我想要变成数组的目录列表。我认为空间分隔将起作用,但每个项目之间的空格数量不同,目录名称中的空格将是一个问题。我想将文本解析为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)
我只需要保存文件夹的日期(不是时间),目录的完整名称(作为一个条目)和括号中的年份。提前谢谢!
答案 0 :(得分: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
答案 1 :(得分: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++;
}
答案 2 :(得分: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';