2013-08-01 71 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'; 
相關問題