繁体   English   中英

正则表达式模式与PHP匹配

[英]Regex pattern match with PHP

我的文件中包含以下数据,该数据会重复多次:

日期:21月份:03年份:2017金额:50类别:杂货账户:银行纸币:昂贵

现在,我要提取“金额:”之后的值,即“ 50”。

我在PHP中使用以下代码:

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

我得到的结果是这样的:

    Da50

您能帮我弄清楚我在这段代码中到底做错了什么吗?

谢谢。

[编辑:$ contents包含所有字符串数据]

这是完整的代码: http ://paste.ideaslabs.com/show/hwj7IiPUcd data.txt的内容是这样的: http : //paste.ideaslabs.com/show/5TxWH8MUX

你可以试试这个

    $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);

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

如果您说有很多巧合,那么您需要选择所有

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

您可以使用以下正则表达式模式...

(?<=Amount:)\d+

参见正则表达式演示

PHP演示

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

使用以下模式: /Amount:\\K\\d+/
它将准确地提取每个Amount:的全部期望数值Amount:无需使用效率低得多的“环顾四周”。

我的Web筛选器软件不允许我访问您的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个步骤即可捕获所需的结果。 模式演示
该模式使用\\K表示“从这一点开始保留字符”,因此不需要捕获组,也不需要“向后看”。
如果您的实际输入数据在Amount:和数字值之间具有可选空格,则只需添加? (空格,然后问号)到:之后的模式。

preg_match_all() ,输出数组的大小与preg_match_all()可以制作的数组一样小:一个包含1个包含4个元素的子数组的数组。 我直接切入代码中的子数组以遵循:

代码:( 演示

$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',
)

就此页面上的其他答案而言,它们都以600多个步骤处理我的测试数据(比我的模式慢12倍/效率低12倍)。 在撰写本文时,其中之一是完全错误的,其中一些使用草率的regex语法,不应从中学习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM