2013-12-11 108 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]; 
}