我有一个来自服务器的巨大字符串,我希望每一行都作为一个对象(以后的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;;
每一行保持不变的唯一因素是“结束标签” 只有两个选择:
我在想它应该是爆炸或一些正则表达的针......
最终输出应为:
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 :(得分:1)
请查看split。 split("\n", $string)
将为您提供一个数组,其中每个条目都是字符串的一行。
答案 1 :(得分:1)
您可以使用file(): -
$lines = file('path/to/file');
foreach($lines as $line){
//do something with $line
}
$ lines是一个数组,每个元素代表文件中的一行,以便
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)
答案 2 :(得分: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]);
<强>输出:强>
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;;
)
答案 3 :(得分:1)
尝试使用preg_split
:
$array = preg_split('/(?<=;;closed;;;;closed;;|;;open;;;;open;;)(?!$)/', $string)
(?<=;;closed;;;;closed;;|;;open;;;;open;;)
确保在分割点之前有结束标记,(?!$)
确保字符串在末尾不分割。
答案 4 :(得分:0)
意味着什么?
exploding()
实际上很大的东西会耗尽你的PHP内存。
你需要解析它的旧学校,char by char并将它们添加到一个桶中。当您的条件满足(如第5 ;
或第10 ;
或其他......)时,请将该桶视为正确的对象并进行处理。但不要存储它。将它推送到文件,数据库或其他东西。
如果事情不是很大,请使用带有&#39; 格式的regular expression
。像:
// keep duplicating the (.*?);; until you reach your number of columns.
preg_match_all '~(.*?);;(.*?);;(.*?);;(.*?);;(.*?);;~s' // pseudo-code :)
这将把它全部分解为对象和属性。你可以迭代和使用它。