2017-03-21 109 views
-1

我有一個文件,該文件被重複以下數據多次:正則表達式匹配PHP

日期:21 月:03 年份:2017年 金額:50 類別:雜貨店 賬戶:銀行 注:昂貴的

現在,我想提取「金額:」,即「50」後面的值。

我使用PHP中下面的代碼:

$result = preg_split("/Amount/", $contents); 
$truncated = substr($printresult, 1, 2); 
print_r($truncated); 

我得到結果是這樣的:

Da50 

能否請你幫我弄清楚到底我在做什麼這段代碼錯了?

謝謝。

[編輯:$內容包含所有的字符串數據]

這是整個代碼:data.txt中的http://paste.ideaslabs.com/show/hwj7IiPUcd 內容是這樣的:http://paste.ideaslabs.com/show/5TxWH8MUX

+0

@ chris85添加了一個代碼鏈接。請看一下。 – n00b12345

+0

data.txt的內容在這裏:http://paste.ideaslabs.com/show/5TxWH8MUX – n00b12345

+0

@ chris85我非常抱歉。張貼之前編輯過多:無論如何這裏是:http://paste.ideaslabs.com/show/hwj7IiPUcd – n00b12345

回答

0

您可以使用以下正則表達式模式...

(?<=Amount:)\d+ 

看到regex demo

PHPdemo

$regex = '/(?<=Amount:)\d+/'; 
$arraynext = file_get_contents('data.txt'); 
preg_match_all($regex, $arraynext, $result); 
print_r($result); 
+0

我會重新檢查代碼,由於某些原因,我的代碼中出現「DaCa」。 – n00b12345

+0

@ n00b12345'data.txt'的內容是什麼? – m87

+0

@siam this - > http://paste.ideaslabs.com/show/5TxWH8MUX – n00b12345

1

你可以試試這個

$subject = "Date:21 Month:03 Year:2017 Amount:50 Category:Grocery Account:bank Note:expensive"; 

$pattern = "/Account/"; 

    preg_match($pattern, $subject, $matches); 
    print_r($matches); 
+0

我得到「莫」作爲結果。 – n00b12345

+0

我正在獲取帳戶。 –

+0

我剛剛添加了一個鏈接到整個代碼,如果可能的話請看看。 – n00b12345

1

da來自Date在你的字符串的開始。您需要使用preg_matchpreg_match_all來提取完全匹配。 preg_split拆分找到的術語,索引0,你不關心。嘗試:

$arraynext = 'Date:21 
Month:03 
Year:2017 
Amount:50 
Category:Wow 
Account:The 
Note:This'; 
$endresult = preg_match("/\s*Amount:\s*(\d+)/", $arraynext, $match); 
echo $match[1]; 

正則表達式演示:https://regex101.com/r/SA48sm/1/

PHP演示:https://3v4l.org/6jaCV

1

如果你說你有很多的巧合,那麼你就需要選擇所有

preg_match_all('/(?<=Amount:)[\d]{0,}/', $contents, $result); 
foreach($result as $res) { 
    print_r($res); 
} 
+0

這個答案不使用正則表達式的最佳做法!字符類和貪婪的量詞表達式的使用並不周到。 – mickmackusa

0

使用這種模式:/Amount:\K\d+/
它會準確地提取所需的全部數量每個Amount:後面的eric值不使用效率低得多的「周邊」。

我的網頁過濾軟件不允許我訪問您的pastelabs鏈接,所以我看不到您的實際輸入。 (這是你爲什麼要將你的輸入樣本直接發佈到你的問題中的很多原因之一)。你聲明你有幾行你必須從中提取,所以這是我已經測試過的樣本輸入:

Date:21 Month:03 Year:2017 Amount:50 Category:Grocery Account:bank Note:expensive 
Date:1 Month:04 Year:2017 Amount:150 Category:Grocery Account:bank Note:expensive 
Date:14 Month:04 Year:2017 Amount:5 Category:Grocery Account:bank Note:expensive 
Date:28 Month:04 Year:2017 Amount:5935 Category:Grocery Account:bank Note:expensive 

我的模式僅在48步驟中捕獲了所需的結果。 (Pattern Demo
該模式使用\K,意思是「從這一點開始保留角色」,因此不需要捕捉組,也不需要「向後看」。
如果您的實際輸入數據具有Amount:和數字值之間的可選空格,則只需將?(空格然後問號)添加到:之後的模式。

當與preg_match_all()一起使用時,輸出數組小至preg_match_all()可以做成:包含1個具有4個元素的子陣列的數組。我直接切到子陣在我的代碼如下:

代碼:(Demo

$in='Date:21 Month:03 Year:2017 Amount:50 Category:Grocery Account:bank Note:expensive 
Date:1 Month:04 Year:2017 Amount:150 Category:Grocery Account:bank Note:expensive 
Date:14 Month:04 Year:2017 Amount:5 Category:Grocery Account:bank Note:expensive 
Date:28 Month:04 Year:2017 Amount:5935 Category:Grocery Account:bank Note:expensive'; 

var_export(preg_match_all('/Amount:\K\d+/',$in,$out)?$out[0]:[]); 

輸出:

array (
    0 => '50', 
    1 => '150', 
    2 => '5', 
    3 => '5935', 
) 

至於此頁面上的其他答案,他們都通過步驟處理我的測試數據(比我的模式慢12倍以上/效率低)。在這篇文章的時候,其中一個是完全錯誤的,有些使用馬虎的正則表達式語法,不應該從中學習。