2015-05-20 122 views
-1

我在iPhone上打字因此這將是我很難格式化代碼等PHP複雜的正則表達式

基本上,我有內容類似下面的文本文件:

Mercedes Benz 4726498 on April 23rd 2015 03:02:14 am (1847284839) 
Vauxhall Astra 3819482 on April 25th 2015 01:26:34 pm (382838484) 
Vauxhall Astra Estate 4728482 (22) on June 22nd 2015 02:48:42 pm (382848388) 

基本上,它是一個系列的多個詞之一,有7位數字,然後在括號中的一些機會,日期字符串,並在年底

每一行都將有一系列的括號中的數字的字數,7位數字,日期字符串和數字結尾

在括號如在第三行中的數字是在某些行而不是全部

基本上,我想要寫在PHP正則表達式來提取所有這些信息以外的日期字符串

I」我已經嘗試過各種各樣的嘗試和錯誤,只是無法達成解決方案!

如果有人能幫助我,我會非常感激! :-)

編輯追加評論最佳嘗試: 它是這樣的:

preg_match('/(^[a-zA-Z\'-]+\s[a-zA-Z\'-]+) ([0-9]+) (([0-9]+))(\s(([0-9]{2}?)))?/', $line, $matches); 

謝謝你們! 馬克

+1

請發佈您的最佳嘗試,即使它不起作用。解決方案非常簡單,應該很容易解釋你出錯的地方。 – Amadan

+0

嘗試一個活的正則表達式編輯器(http://www.phpliveregex.com)來擺弄! – Luke

+0

@Amadan我目前正在關閉計算機,但它是這樣的:preg_match('/(^ [a-zA-Z \'-_] + \ s [a-zA-Z \' - _)+)([0-9] +)\(([0-9] +)\)(\ s \(([0-9] {2}?)\))?/',$ line, $匹配); -----我似乎無法讓它可選地抓住括號中的數字。我顯然不是正則表達式專家!我的代碼也只需要兩個字,而不是多個。所以如果有三個字開頭,它將不匹配:( –

回答

1

以下似乎工作:

([A-Za-z ]*) ([0-9]{7}) (?:\(([0-9]{2})\))?on ([A-Za-z0-9: ]*) \(([0-9]*)\)

當應用到例如輸入,我們得到如下數組:

array(6 
    0 => Mercedes Benz 4726498 on April 23rd 2015 03:02:14 am (1847284839) 
    1 => Mercedes Benz 
    2 => 4726498 
    3 => 
    4 => April 23rd 2015 03:02:14 am 
    5 => 1847284839 
) 

array(6 
    0 => Vauxhall Astra Estate 4728482 (22) on June 22nd 2015 02:48:42 pm (382848388) 
    1 => Vauxhall Astra Estate 
    2 => 4728482 
    3 => 22 
    4 => June 22nd 2015 02:48:42 pm 
    5 => 382848388 
) 

嘗試一下在http://www.phpliveregex.com

+0

這看起來非常糟糕,明天當我回到我的電腦並將其標記爲正確答案時,我會試一試!乾杯 –

+0

好好的,還是在原帖中發佈你的解決方案! – Luke

2

你太過於複雜。首先,一般來說,沒有必要具體說明哪些角色可以作爲單詞進入。其次,如果你不知道會有多少單詞,不要試圖將它們作爲單獨的單詞來匹配。

(\D+)\s+(\d+)\s+(?:\((\d+)\))?.*\((\d+)\) 

應該足夠:

  • 一些非數字(捕獲爲組1)
  • 一些空間
  • 一些數字(捕獲作爲第2組)
  • 一些空間
  • 可能的括號,裏面的一些數字(將它們捕獲爲組3)
  • 東西
  • 括號,裏面的一些數字(捕捉它們作爲第4組)

如果可能的話有可能是在車名的數字,那麼你可能需要在確定接下來的事情更準確一點(數量):

(.+)\s+(\d{7})\s+(?:\((\d+)\))?.*\((\d+)\)