2013-10-02 58 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