2017-03-21 140 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倍以上/效率低)。在这篇文章的时候,其中一个是完全错误的,有些使用马虎的正则表达式语法,不应该从中学习。