2014-06-16 76 views
0

我有以下通過從函數中獲取數組逐行返回。PHP的正則表達式解析行

[1mSlot別名UpRate DnRate的MinAct
[4M /標識鏈接鏈接
[0米1/1 113822003 0 0 1 1/1,1/2,1/5,2/1,
3/1,3/2,4/1,4/2

1/3 432144003 0 0 1 1/3,3/3
1/4 128447003 0 0 1 1/4,3/4
1/6 123458003 0 0 1 1/6,2/5,4/8,6/6,
6/25
1/9 123445003 0 0 1 1/9,1/31,2/18,3/9,
5/8,6/22,6/23,6/24,
6/26,7/8,7/11,7/13,
7/14,8/6,8/7, 8/8,
8/11,8/22,9/11,9/12

我有在http://www.regexr.com/工作,但不要在PHP一切工作的正則表達式如下表現如預期似乎。特別是EfmLinkRegex,負向前視功能不適用。前三個我使用preg_match()鏈接一個我使用preg_match_all()。我使用

$OrderRegex = '([0-9]{4,7}003)'; 
$GroupRegex = '(^[0-9]{1,2}\/[0-9]{1,2})'; 
$LinkRegex = '/(?!^[0-9]{1,2}\/[0-9]{1,2})([0-9]{1,2}\/[0-9]{1,2})/'; 

當前代碼:

foreach ($Data as $row) 
{ 
    preg_match($OrderRegex, $row, $OrderMatches); 
    preg_match($GroupRegex, $row, $GroupMatches); 
    preg_match_all($LinkRegex, $row, $LinkMatches); 
} 

我在我的示例輸入的3行運行在上面是第一「1/1」值是通過「[0米」開頭否定正則表達式(目前不起作用)。我還需要一種方法在沒有匹配訂單的行中添加鏈接,以將其分配給該訂單。

例如最終結果是:

Order: 113822003 
Group: 1/1 
Links: 1/1, 1/2, 1/5, 2/1, 3/1, 3/2, 4/1, 4/2 

Order: 432144003 
Group: 1/3 
Links: 1/3, 3/3 

Order: 128447003 
Group: 1/4 
Links: 1/4, 3/4 

etc, etc, etc, 

例如最終結果作爲數組:

陣列([組] =>數組([0] => 1/1)[訂購] =>數組( [0] => 113822003)[鏈接] =>數組([0] => 1/1 [1] => 1/2 [2] => 1/5 [3] => 2/1 [4] = > 3/1 [5] => 3/2 [6] => 4/1 [7] => 4/2))

我知道最有可能的東西很簡單我很想念這裏,但它是逃避我。如果我可以匹配「組」減去^,只要它以某種方式在順序之前,那麼只需將它添加到鏈接數組中?

編輯: 發現通過「$ row = substr($ row,1,strlen($ row));」傳遞每個$行似乎已經解決了我的問題與Group和Link正則表達式字符串拉動正確的匹配,我猜不知有些字符串的開頭有不可見的字符,不允許正則表達式中字符串指示符的開始正常工作。

所以現在我只需要弄清楚如何讓這個不包含「秩序」的任何行添加鏈接到上一行的鏈接匹配

+0

代替我不是承擔你正在尋找的輸出。你可以爲你想要的輸出粘貼某種陣列嗎?你會樂意用一個正則表達式來完成嗎?它是否必須一行一行? – zx81

+0

PHP的preg_ *函數需要分隔符,例如/.../或〜...〜。在第一種和第二種情況下,我認爲它是以()作爲分隔符。在'引號內添加〜分隔符。 –

+0

是的,它必須是逐行的(或者更具體地說,每一行都是一個名爲「$ Data」的數組中的一個入口,所以我通過入口解析出它),這就是telnet類返回讀取行的方式從路由器。向其他兩個添加/.../對回報沒有幫助。 – James

回答

0

我建議你在兩個步驟去做。
步驟1:
使用此模式^.*?(?=\d+\/\d+)|(,)\v|(\v)\v+|(003)(?: \d+){3}使用gs選項並替換w/$1$2$3進行清理。
Demo

結果將看起來像這樣

1/1 1/1 113822003,1/2,1/5,2/1,3/1,3/2,4/1, 4/2
1/3 432144003 1/3,3/3
1/4 128447003 1/4,3/4
1/6 123458003 1/6,2/5,4/8,6/6 ,6/25
1/9 123445003 1/9,1/31,2/18,3/9,5/8,6/22,6/23,6/24,6/26,7/8, 7/11,7/13,7/14,8/6,8/8,8/8,8/8,8/22,9/11,9/12

第2步:
現在是很容易執行另一個正則表達式,並與gm選項得到你想要的最終結果,像這樣
使用這種模式^(\d+\/\d+)\s*(\d{9})\s*([, \/0-9]+)Order: $2\nGroup: $1\nLinks: $3\n
Demo

+0

我希望我能用Regex做到這一點,非常感謝你,這些讓我得到了我需要的答案。一個問題,你認爲最有效的方法來做第一步會是因爲每行是一個數組中的一個條目? – James

+0

我不知道PHP,但我會想象你使用「for」循環遍歷每個數組值並在其上應用RegEx。 –