2012-07-25 145 views
1

在我開始之前,我知道這是CSV,我知道有一個函數存在內置PHP。 我得到了以下的模式:正則表達式返回預期結果加另一行上的換行符

preg_match_all("/([^\"]|\"[^\"]*\")*?(r\n|\n\r|\r|\n)/i", $CSV, $Matches);

誰來解析這樣的事情:如果我嘗試添加

[2] => Array 
    (
    ) 

[3] => Array 
    (
     [0] => CAN 
     [1] => * 
     [2] => 
     [3] => 
     [4] => 
     [5] => 10000.0000 
     [6] => 19999.0000 
     [7] => 35.5000 
    ) 

[4] => Array 
    (
    ) 

[5] => Array 
    (
     [0] => CAN 
     [1] => * 
     [2] => 
     [3] => 
     [4] => 
     [5] => 0.0000 
     [6] => 4999.0000 
     [7] => 19.7500 
    ) 

[6] => Array 
    (
    ) 

Country,Region/State,City,"Zip/Postal Code\n From","Zip/Postal Code To","Weight From","Weight To","Shipping Price","Delivery Type"\n\r 
CAN,*,,,,0.0000,4999.0000,29.7500,Priority\n\r 
CAN,*,,,,10000.0000,19999.0000,35.5000,Express\n\r 
CAN,*,,,,0.0000,4999.0000,19.7500,Express\n\r 
CAN,*,,,,20000.0000,99999999.9999,59.0000,Priority\n\r 
CAN,*,,,,5000.0000,9999.0000,34.7500,Priority\n\r 
CAN,*,,,,20000.0000,99999999.9999,41.5000,Express\n\r 
CAN,*,,,,5000.0000,9999.0000,24.4500,Express\n\r 
CAN,*,,,,10000.0000,19999.0000,48.0000,Priority\n\r 
CAN,*,,,,10000.0000,19999.0000,29.7500,Standard\n\r 
CAN,*,,,,20000.0000,99999999.9999,36.5000,Standard\n\r 
CAN,*,,,,500.0000,9999.0000,20.3500,Standard\n\r 
CAN,*,,,,90.0000,499.0000,9.7500,Standard\n\r 
CAN,*,,,,50.0000,89.0000,1.8000,Standard\n\r 
CAN,*,,,,30.0000,49.0000,1.5000,Standard\n\r 
CAN,*,,,,0.0000,29.0000,1.0000,Standard\n\r 
USA,*,,,,20000.0000,99999999.9999,160.0000,Express\n\r 
USA,*,,,,10000.0000,14999.0000,76.0000,Express\n\r 
USA,*,,,,1000.0000,4999.0000,42.0000,Express\n\r 
USA,*,,,,15000.0000,19999.0000,155.0000,Priority\n\r 
USA,*,,,,5000.0000,9999.0000,94.0000,Priority\n\r 
USA,*,,,,0.0000,999.0000,75.5000,Priority\n\r 
USA,*,,,,15000.0000,19999.0000,98.0000,Express\n\r 
USA,*,,,,5000.0000,9999.0000,61.5000,Express\n\r 
USA,*,,,,0.0000,999.0000,40.0000,Express\n\r 
USA,*,,,,20000.0000,99999999.9999,230.0000,Priority\n\r 
USA,*,,,,10000.0000,14999.0000,120.0000,Priority\n\r 
USA,*,,,,1000.0000,4999.0000,61.5000,Priority\n\r 
USA,*,,,,500.0000,999.0000,25.5000,Standard\n\r 
USA,*,,,,90.0000,499.0000,13.3500,Standard\n\r 
USA,*,,,,50.0000,89.0000,3.0000,Standard\n\r 
USA,*,,,,30.0000,49.0000,1.8000,Standard\n\r 
USA,*,,,,0.0000,29.0000,1.5000,Standard\n\r 

我得到的resulst類似於?:在換行符組中仍然有效。任何人都可以幫助我,我卡在那裏。謝謝。

+2

如果你知道,爲什麼不使用它? – OrangeDog 2012-07-25 20:03:11

+1

什麼奇怪的換行符是?我從來沒有見過'\ n \ r'。還有(可能與之有關?)你的正則表達式在'r'之前缺少一個反斜槓。 – 2012-07-25 20:06:31

+0

@TimPietzcker Oups,我添加了反斜槓。感謝您的注意。 '\ n \ r'只是一種可能發生的可能性。我讓我的課程適合初學者。還要補充一點,在每個字符(而不是正則表達式)上生成子數組需要通過分隔符(,)來提取所有內容,而不是在雙引號之間。 – 2012-07-25 20:08:59

回答

1

不知道任何php匹配的細節,我會聽你的話,正則表達式工作就像你顯示它(使用my preferred regex我不以相同的方式捕獲)。

我假設你試圖刪除那些空白匹配。我也會相信這些「換行符」實際上是編碼到輸入中的,而不是作爲文字\的和\r的和\n的。

問題似乎是「換行符」匹配兩次?就像你只匹配\n一遍,然後在\r上下一遍?

最簡單的解決方案是將新行限制爲您知道該文件的類型:/([^\"]|\"[^\"]*\")*?(\n\r)/ 這對您有幫助嗎?

另外,我會只是在每行輸入使用正則表達式分割(用逗號分隔)

+0

沒有上面的正則表達式只是給出了一個簡單的子行數列...我創建的子數組就像我說的使用程序化而不是正則表達式。我明天將在工作中檢查你的解決方案。謝謝。 – 2012-07-26 00:52:23

+0

好的,我測試了它。這很有用,但我沒有使用你的解決方案。問題是:首先,我的OP帖子中出現錯誤。我真的需要用'?:'來不返回結果。我還首先使用'\ r \ n',然後使用'\ n'和'\ r'。組\ n \ r'已被刪除。感謝您領導我。 – 2012-07-26 14:04:15

相關問題