2012-12-28 45 views
1

我對PHP很新,所以我爲這個看似簡單的問題表示歉意。我需要將一行文本解析爲不同的變量。更具體地說,我需要解析不同數組中的多行文本。該文本行將類似於以下內容使用php解析文本行到不同的變量

timeStamp UserName* garbage text Number x item* 
timeStamp UserName* garbage text Number x item* 
timeStamp UserName* garbage text Number x item* 

userName和item都可以包含空格。我會假設最好的方式去做這個會是4個不同的數組?

實際數據看起來像下面

03:12:34 mhopkins321 has acquired 5 x bottles of water 
09:38:01 Nick Smith has acquired 100 x pennies 
23:22:59 Fancy Frank has acquired 15684 x artichoke hearts 

所以我將承擔陣列將

$timeStamp   $userName  $amount  $items 
03:12:34   mhopkins321  5   bottles of water 
09:38:01   Nick Smith  100   pennies 
23:22:59   Fancy Frank  15684  artichoke hearts 
+0

http://php.net/explode? http://php.net/preg_match? –

+0

來自文件???你的垃圾文本是否包含空格? – Baba

+1

顯示一些實際的行,你想在數組中有什麼 – piotrekkr

回答

2

這是機解析一個非常壞的格式。特別有問題的是,名稱可能有空格,但沒有分隔。

解析這個唯一的萬無一失的方法是知道可能出現在名稱和金額之間的所有「垃圾文本」字符串。除非你有完整的清單,否則你可能會弄亂你的用戶名。

可以使用explode()來解析這個問題,將一條線分成一個數組然後提取零件。不過,我認爲你應該使用正則表達式。

$sample = " 
03:12:34 mhopkins321 has acquired 5 x bottles of water 
09:38:01 Nick Smith has acquired 100 x pennies 
23:22:59 Fancy Frank has acquired 15684 x artichoke hearts 
"; 

$re = '/^(?<timeStamp>[0-9]{2}:[0-9]{2}:[0-9]{2}) # timestamp 
     \s+ 
     (?<userName>[\w\s]+)  # user name 
     \s+(?:has\s+acquired)\s+ # garbage text between name and amount 
     (?<amount>\d+)    # amount 
     \s+x\s+      # multiplication symbol 
     (?<items>.*)\s*$   # item name (to end of line) 
     /xmu'; 

preg_match_all($re, $sample, $matches, PREG_SET_ORDER); 

var_export($matches); 
+0

缺少定義的拆分器也是我的問題。 「垃圾文本」將永遠是「已獲得」,我認爲這在某種程度上有所幫助 – mhopkins321

+2

這不是「有所幫助」,它是絕對必要的信息。 –

+0

這樣做讓我更喜歡csvs – mhopkins321

2

看起來你需要一個正則表達式來分割文本行。 這不是一件容易理解的事情,而是一種你需要的工具,用於你關聯的其他情況。 手冊頁:http://br2.php.net/manual/en/book.pcre.php

您需要在文字上找到圖案。 例如,時間戳總是從行首開始,並且長度爲8個字符?

+0

正確。時間戳總是8個字符。 item總是在「x」之後,但是可能在字符串中有多個x。數字總是在x之前。並且用戶名可以在時間戳和數字之間存在,並且可能每次修剪「已獲取」? – mhopkins321

+0

好的,但字符串的末尾應該總是匹配一個產品,並且您知道有一個已獲取的常量字符串。弗朗西斯正則表達式可以很好地解決你的問題。 – cavila