preg_replace导致浏览器错误

时间:2014-07-30 09:29:16

标签: php regex

我有一个用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 in preg_match function returning browser error

但它并没有真正帮助,因为降低pcre.recursion_limit只会导致正则表达式根本不起作用,并返回PREG_RECURSION_LIMIT_ERROR错误。

使用正则表达式是否有更有效的方法来修剪除大文件中最后一行数据之外的所有内容?或者我可以调整一些设置以使其通过Apache工作?

更新

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

2 个答案:

答案 0 :(得分:1)

在换行符上拆分字符串,并获取最后一行:

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

答案 1 :(得分:0)

建议使用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-development-5/php-quick-way-to-read-last-line-156010.html