将大绳子切成物体

时间:2013-10-02 14:40:19

标签: php regex

我有一个来自服务器的巨大字符串,我希望每一行都作为一个对象(以后的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. ;;开放;;;;打开;;
  3. 我在想它应该是爆炸或一些正则表达的针......

    最终输出应为:

    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;;    
    

    字符串不是“行”,它是一个大行。

5 个答案:

答案 0 :(得分:1)

请查看splitsplit("\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;;)确保在分割点之前有结束标记,(?!$)确保字符串在末尾不分割。

viper7 demo

答案 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 :)

这将把它全部分解为对象和属性。你可以迭代和使用它。