在一个或多个字符后拆分字符串

时间:2014-05-22 06:42:38

标签: php regex

我有一个包含许多行的文件,例如:

2011-03-23  10:11:08    34  57  2   25,5    -
2011-03-23  10:11:12    67  54  3   3,5 -
2011-03-23  10:11:16    76  57  3   2,4 -
2011-03-23  10:11:18    39  41  2   25,5    +

每行以+-结尾。我希望在+-签名后拆分文件内容。行没有相同的字符数。

我尝试使用fgets()开启auto_detect_line_endings来阅读该文件,但仍有许多行合并为一行:

输出示例: 输出应该是两行,但只有一行(你可以看到“新行”,但PHP没有):

2011-03-23 10:11:08 34 57 2 25,5 - 2011-03-23 10:11:12 67 54 3 3,5 -

修改

我用来读取文件的代码

ini_set('auto_detect_line_endings', true);
    $handle = fopen($filename, "r");
    $index = 1;
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            if (trim($line) != '') {
                $data = preg_split('/\s+/', trim($line));
                // Saving into DB...
                $index++;
            }
        }
    }
    fclose($handle);

2 个答案:

答案 0 :(得分:2)

为了确保获得所有可能的new line combinations,您应该使用preg_split代替:

  

LF = \nCR = \r

     

LF:Multics,Unix和类Unix系统(GNU / Linux,OS X,FreeBSD,AIX,Xenix等),BeOS,Amiga,RISC OS等。
  CR:Commodore 8位机器,Acorn BBC,ZX Spectrum,TRS-80,Apple II系列,Mac OS,最高版本9和OS-9
  LF+CR:Acorn BBC和RISC OS假脱机文本输出   CR+LF:Microsoft Windows,DEC TOPS-10,RT-11和大多数其他早期的非Unix和非IBM操作系统,CP / M,MP / M,DOS(MS-DOS,PC DOS等) ,Atari TOS,OS / 2,Symbian OS,Palm OS,Amstrad CPC

正则表达式为/(\r\n|\n\r|\n|\r)/CR+LFLF+CRLFCR):

$lines = preg_split('/(\r\n|\n\r|\n|\r)/', $string);

DEMO


如果您打算没有任何空行(空格数为空的行),您可以在正则表达式的末尾添加一个可选的\s*,它将匹配0到无限量的空格后换行符:

$lines = preg_split('/(\r\n|\n\r|\n|\r)\s*/', $string);

DEMO


如果你打算没有任何空行,但是希望的空白行计为空,你甚至可以简化正则表达式:

$lines = preg_split('/[\n\r]+/', $string);

DEMO

答案 1 :(得分:1)

尝试:

<?php
  $input = "2011-03-23  10:11:08    34  57  2   25,5    -
          2011-03-23  10:11:12    67  54  3   3,5 -
          2011-03-23  10:11:16    76  57  3   2,4 -
          2011-03-23  10:11:18    39  41  2   25,5    +";

  // 1st explode by new line
  $output = explode("\n", $input);
  print_r($output);


  // 2nd remove last character
  $result = array();
  foreach($output as $op)
  {
     $result[] = substr($op, 0, -1);
  }
  print_r($result);


输出:

Array
(
   [0] => 2011-03-23  10:11:08    34  57  2   25,5    -
   [1] => 2011-03-23  10:11:12    67  54  3   3,5 -
   [2] => 2011-03-23  10:11:16    76  57  3   2,4 -
   [3] => 2011-03-23  10:11:18    39  41  2   25,5    +
)
Array
(
   [0] => 2011-03-23  10:11:08    34  57  2   25,5    
   [1] => 2011-03-23  10:11:12    67  54  3   3,5 
   [2] => 2011-03-23  10:11:16    76  57  3   2,4 
   [3] => 2011-03-23  10:11:18    39  41  2   25,5    
)


DEMO:
http://3v4l.org/0uIe7#v430