2016-06-25 58 views
1

我有一個配置文件,它看起來有點像這樣拆分文件到相關科室在PHP

Blah 
Diddel 
Foo 
Bar1 
Bar2 
One 
XXY 
Password%1 = something 
Password%2 = other 
Password%3 = nuffing 
Completely different stuff here 
RandomS6}=2 
User%1 = Henry 
User%2 = Marcus 
User%3 = SecretAdmin 
More stuff 
Even more stuff 
Loads of stuff 

這是一個config.conf文件,用戶通過PHP的形式上傳。我想讀取該文件,並建立5頁新的文件出來,如下所示:

  1. 所有從開始排隊幷包括行XXY
  2. 所有的「密碼%......」行
  3. 最後的「密碼......」和第一之間的界線「用戶......」行
  4. 所有「用戶......」行
  5. 下的一切「用戶......」行

現在我匹配可以處理字符串,正則表達式將是甜的,但因爲它是一個配置有嚴格的格式,我可以

while (substr($line,0,5) == "Passw" { ...

我可以不在身邊讓我的頭是結構方式bodge它。 我開始使用嵌套的if循環,但是a)讓我感到瘋狂效率低下('User ...'塊之後的每一行仍然得到'Password ...'的測試)並且b)它不僅看起來很模糊也是調試的噩夢。

必須有一個聰明的方法來做到這一點?我認爲它就像交易牌一樣 - 「從甲板上開始,將牌夾入這堆,直到'x'發生,然後將牌夾入另一堆,直到'y'發生。」但我不夠程序員的頭腦。

我已經做了大量的谷歌搜索和在這裏 - 但我得到的頁面,告訴我如何分割逗號,或按行數拆分,但沒有教程分割語義,因爲它是?

非常感謝任何提示!

P.S. - 如果有更適合該角色的東西,則不必是PHP。但我是Ruby的初學者和Python的寶貝 - 我知道PHP比其他任何東西都好。

+0

您描述的「交易卡」算法可以使用'itertools'在Python中輕鬆實現。 *(這與其他語言不太複雜)*。 –

+0

itertools書籤。對於這項任務來說,學習曲線太陡,但看起來值得投入一段時間。謝謝! – sheepsky

回答

0

我選擇了這種方法,並sectionizing四個步驟:

  1. 比賽稱爲.conf變量/分隔符,並將它們存儲(密碼, 用戶,XXY)
  2. 更換沒事匹配的字符串(省略)
  3. 拆分新修改的字符串插入到部分
  4. 合併(1)和(3)

下面是代碼:

$matches = []; 
$string = preg_replace_callback(
     '~^(?>User.+|Password.+|XXY)$~m', 
     function ($match) use (&$matches) { 
      @$matches[substr($match[0], 0, 4)] .= $match[0]; 
      return null; 
     }, 
     $input 
    ); 

print_r(array_merge($matches, preg_split('/^\s+$/m', $string))); 

結果是有點討厭,而不是完全爲了(更多的工作來做到這一點),但你有你想要的東西(Live demo):

Array 
(
    [XXY] => XXY 

    [Pass] => Password%1 = something 
Password%2 = other 
Password%3 = nuffing 

    [User] => User%1 = Henry 
User%2 = Marcus 
User%3 = SecretAdmin 

    [0] => Blah 
Diddel 
Foo 
Bar1 
Bar2 
One 

    [1] => 
Completely different stuff here 
RandomS6}=2 

    [2] => 
More stuff 
Even more stuff 
Loads of stuff 
) 
+0

哇,就是這樣,太棒了!非常感謝! – sheepsky

+0

不客氣。如果這回答您的問題,您可以點擊複選標記圖標將其標記爲已接受。 @sheepsky – revo

+0

花了我一會兒才找到它 - 現在檢查。再次感謝! – sheepsky