2013-10-02 96 views
1

我有一個來自服務器的巨大字符串,並且我希望每行都作爲對象(用於以後的foreach循環)。將大字符串切割成對象

這是字符串的一部分:

1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;; 

是不會變的每一行的唯一的事情就是「關閉標籤」
只有兩種選擇:

  1. ;;關閉; ;;;關閉;;
  2. ;; open ;;;; open ;;

我想,應該是針爆炸或一些正則表達式...

最終的輸出應該是:

element[0] 1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
element[1] 1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
element[2] 1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
element[3] 1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;;  

的字符串不進來「行」這是一條大線。

+0

你的意思是每行一個數組元素? –

+0

從服務器傳來的每一行之後是否有回車? – user2793390

+0

是的,對不起,我是新的PHP ... – user2706762

回答

1

您可以使用preg_match_all function

$s = <<< EOF 
1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;; 
EOF; 

if (preg_match_all('~(.*?;;(open|closed);{4}\2;;)~', $s, $arr)) 
    print_r($arr[1]); 

OUTPUT:

Array 
(
    [0] => 1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
    [1] => 1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
    [2] => 1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
    [3] => 1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;; 
) 
+0

謝謝,但字符串不排隊,這是一個大的線。 – user2706762

+0

好吧現在檢查編輯。 – anubhava

+0

越來越null :(,但是謝謝 – user2706762

1

請看看splitsplit("\n", $string)會給你一個數組,其中每個條目是字符串的一行。

1

您可以使用file()此: -

$lines = file('path/to/file'); 
foreach($lines as $line){ 
    //do something with $line 
} 

$線是代表文件中的行,以便

var_dump($lines); 

會看到這樣的各元素的數組: -

array (size=4) 
    0 => string '1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;;' (length=68) 
    1 => string '1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; ' (length=69) 
    2 => string '1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; ' (length=60) 
    3 => string '1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;;' length=63) 
+0

謝謝,但字符串不排隊,這是一個大的線。 – user2706762

+0

啊,好的,那不是你在你的問題中表現出來的。那麼你如何確定你將在哪裏拆分呢? – vascowhite

+0

;; closed ;;;; closed ;;或;;打開;;;;打開;; – user2706762

0

什麼巨大的是什麼意思?

exploding()實際上巨大的東西會耗盡你的PHP內存。

你需要解析它的老派,char by char並將它們添加到一個桶中。當你的條件滿足(如第5個;或第10個;或任何其他......),考慮水桶一個適當的對象,並處理它。但不要存儲它。將它推送到文件,數據庫或其他東西。

如果事情沒有那麼巨大,使用regular expression「對象」格式。像:

// keep duplicating the (.*?);; until you reach your number of columns. 
preg_match_all '~(.*?);;(.*?);;(.*?);;(.*?);;(.*?);;~s' // pseudo-code :) 

而這會將它全部分解成對象和屬性。你可以迭代和使用。

1

嘗試使用preg_split

$array = preg_split('/(?<=;;closed;;;;closed;;|;;open;;;;open;;)(?!$)/', $string) 

(?<=;;closed;;;;closed;;|;;open;;;;open;;)確保有結束標記分割點之前和(?!$)確保該字符串沒有結束分裂。

viper7 demo