2013-12-11 101 views
1

我的正则表达式一个文件,直到我得到这个(例子):PHP加正则表达式解析

December 
Street etc 
500-111 New York 
USA 
January 
Street etc 
111-999 Russia 
Russia 

正如你可以看到,项目被分裂在4比4,第一行是“月'',第二'街道',第三'邮政编码',和第四'国家'。

这么说,我有1500行的这一点,要更准确地说,1504

我循环中的所有项目,如何通过分析类的项目?我到目前为止所尝试的:

$file_handle = fopen("file.txt", "rb"); 
while (!feof($file_handle)) { 

    $line_of_text = fgets($file_handle); 
    $parts = explode("\n", $line_of_text); // Doesn't split by line 

    echo $parts[0] . "<br/>"; // Gives the 1504 lines 

} 
fclose($file_handle); 

我想过使用倍数。 etc ..但我不知道如何实现,因为我可以有多个数字相等,如2和3的倍数,有数字6 ..可能我可以把它放入一个数组,并验证是否已经分裂了。

或者这是很多,有更好的选择?

+1

它是否始终与月份标题之间的行数相同? – brandonscript

+0

@ r3mus如果我确实得到你的问题,是的。正如我在评论中写的那样,我有1504行,并且这些项目在4行中分开。 – user3065191

+0

然后@ PhilPerry的回答是完美的。 – brandonscript

回答

2

如果是总是组的4号线,怎么样

$file_handle = fopen("file.txt", "rb"); 
while (!feof($file_handle)) { 

    for ($i=0; $i<4; $i++) { 
     $line_of_text = fgets($file_handle); 

     switch($i) { 
      case 0: // do something with month 
        break; 
      case 1: // do something with street address 
        break; 
      case 2: // do something with postal code and state/region/province 
        break; 
      case 3: // do something with country 
        break; 
     } 
    } 

    // done with a group 
} 
fclose($file_handle); 

我认为“B”模式是因为你在Windows上工作与也许Linux的源文件?这可以解释为什么你在原始代码中没有看到换行符。

+0

解决,谢谢。 – user3065191

1

如果你知道文件内容完全是由4行组成的,那么这应该是有用的。 1504行不是很多。所以我只需要用file_get_contents一次加载它。 fopen只是额外的工作,没有任何好处。

$lines = explode("\n",str_replace("\r","",file_get_contents($path))); 

for(int $i=0; $i < count($lines); $i=$i+4) 
{ 
    $month = $lines[$i]; 
    $street = $lines[$i+1]; 
    $address = $lines[$i+2]; 
    $country = $lines[$i+3]; 
}