Preg_replace导致浏览器错误


preg_replace causing browser error

我有一个用PHP编写的web应用程序,需要解析数据文件。它使用preg_replace删除文件顶部的任何列标题等,然后逐行循环遍历文件的其余部分,使用preg_match提取每行上的相关值。

文件格式如下:

Column heading 1  Column heading 2  Column heading 3 Column heading 4
       0.000000000E+0000     0.000000000E+0000     0.000000000E+0000     0.000000000E+0000  
       0.000000000E+0000     0.000000000E+0000     0.000000000E+0000     0.000000000E+0000  
       0.000000000E+0000     0.000000000E+0000     0.000000000E+0000     0.000000000E+0000  
       0.000000000E+0000     0.000000000E+0000     0.000000000E+0000     0.000000000E+0000  
       0.000000000E+0000     0.000000000E+0000     0.000000000E+0000     0.000000000E+0000  

文件中最多可能有10,000行数据。我刚刚有一个客户问我是否只能匹配最后一行数据,而不是从每一行获取数据。

因此,我需要一个正则表达式来删除列标题和每一行数据,除了最后一行。下面是我使用的代码:

$startsWith = "/^Column heading 1  Column heading 2  Column heading 3 Column heading 4'r'n(   [0-9]{1}'.[0-9]{9}E['+-][0-9]{4}     [0-9]{1}'.[0-9]{9}E['+-][0-9]{4}     [0-9]{1}'.[0-9]{9}E['+-][0-9]{4}     [0-9]{1}'.[0-9]{9}E['+-][0-9]{4}  'r'n(?!$))*/s";
$str = preg_replace($startsWith,'',$str);

这应该只留下最后一行数据。如果我通过命令行PHP运行脚本,这绝对没问题。然而,如果我通过浏览器运行它,我没有从服务器得到响应-只是一个空白页面。

我已经看到了这个问题:RegExp在preg_match函数返回浏览器错误

但是它并没有真正的帮助,因为降低pcre.recursion_limit只会导致regex根本不工作,并返回PREG_RECURSION_LIMIT_ERROR错误。

是否有一个更有效的方法,使用正则表达式,修剪一切除了最后一行数据在一个大文件?或者我可以调整一些设置使其通过Apache工作?

<标题> 更新

谢谢大家的建议,但是,由于系统的构建方式,我需要使用正则表达式。对于解析这个特定的文件,我知道这不是理想的方法,但是对于其他文件类型,这是唯一的方法。该系统是为解析许多非常奇怪的文件类型而构建的,而正则表达式是实现这一目标的唯一方法。我提供的正则表达式工作时,通过PHP CLI运行,但不是通过网页-是否有一个更有效的正则表达式或一些设置,我可以改变,使其通过Apache工作?

以换行符分隔字符串,得到最后一行:

$lines = explode("'n", $str);
$last_line = array_pop($lines);

我建议使用fseek,因为首先完全加载10000行文件确实是cpu和时间密集型的:

   $fp = fopen("file.txt", "r"); 
   $pos = -1; 
   $t = " "; 
   while ($t != "'n") { 
         fseek($fp, $pos, SEEK_END); 
         $t = fgetc($fp); 
         $pos = $pos - 1; 
   } 
   $t = fgets($fp); 
   fclose($fp); 
   return $t; 

来源:http://forums.devshed.com/php -发展- 5/php快速-方式-读- -线- 156010. - html