2011-12-01 80 views
0

我有一個字符串,它看起來像這樣:整蠱PHP字符串匹配

[2005] 
one 
two 
three 
[2004] 
six 

什麼是最流暢的就是從它那裏得到一個數組,應該是這樣的:

array(
    ['2005'] => "one \n two \n three", 
    ['2005'] => "six", 
) 

.. 。或者甚至可能得到內部陣列切成行數組...

我試着用preg_split做,它工作但沒有給關聯數組鍵,所以我沒有年份數字作爲關鍵字。

有沒有很酷的方式做到這一點,而無需遍歷所有的行?

+0

請注意,您的輸出有錯字 - 應爲'2004'=>「六」 –

+0

無論您是否使用'while(fread)'或者本地函數,你仍然需要讀取字符串。我將每個循環中的每一行用正則表達式來搜索[year]模式,而不是一次對整個字符串進行regex。將問題分解成更小的塊。 – cbednarski

回答

2

/(\[[0-9]{4}\])([^\[]*)/會給你的日期和任何事情之後,直到下一個。

使用這些組來創建您的數組:使用preg_match_all()您將獲得一個$ matches數組,其中$ matches [1]是日期,$ matches [2]是其後的數據。

+0

伎倆,謝謝=) –

0

這稍微複雜:

preg_match_all('/\[(\d+)\]\n((?:(?!\[).+\n?)+)/', $ini, $matches, PREG_SET_ORDER); 

(可以與獲知真實格式約束來簡化。)

1

使用Sylverdrag的正則表達式作爲指導:

<?php 
$test = "[2005] 
one 
two 
three 
[2004] 
six"; 

$r = "/(\[[0-9]{4}\])([^\[]*)/"; 
preg_match_all($r, $test, $m); 
$output = array(); 
foreach ($m[1] as $key => $name) 
{ 
    $name = str_replace(array('[',']'), array('',''), $name); 
    $output[ $name ] = $m[2][$key]; 
} 

print_r($output); 
?> 

輸出(PHP 5.2 .12):

Array 
(
    [2005] => 
one 
two 
three 

    [2004] => 
six 
)