在文本文件中的特定对象内找到两种模式

时间:2020-06-03 19:05:13

标签: php regex pattern-matching text-files

我正在尝试使用PHP在文本文件中找到两种模式。

文本文件如下:

[transactionDetails] => wsTransactionDetail Object
    (
        [sharesAmount] => 
        [sharesNumber] => 
        [amount] => 33450
        [commerceCode] => 1234567890
        [buyOrder] => 123321
    )

[detailOutput] => wsTransactionDetailOutput Object
    (
        [authorizationCode] => 001122
        [paymentTypeCode] => VD
        [responseCode] => 0
        [sharesNumber] => 0
        [amount] => 33450
        [commerceCode] => 1234567890
        [buyOrder] => 123321
    )

我的PHP代码如下:

$pattern1 = preg_quote("authorizationCode", '/');
$pattern2 = preg_quote("amount", '/');

$pattern = "/^.*($pattern1).*\$|($pattern2).*\$/m";

if(preg_match_all($pattern, $contents, $matches)){
   echo "Founds:\n";
   echo implode("\n", $matches[0]);
}

它工作正常,但是我两次获得 [amount] => 33450 ,因为文本文件中的“ amount ”是两次。

我只需要在文本文件的此部分内部获取“ 金额”和“ authorizationCode ”值:

[detailOutput] => wsTransactionDetailOutput Object
    (
        [authorizationCode] => 001122
        [paymentTypeCode] => VD
        [responseCode] => 0
        [sharesNumber] => 0
        [amount] => 33450
        [commerceCode] => 1234567890
        [buyOrder] => 123321
    )

有人可以帮我吗?我将不胜感激。

我认为我的问题在于正则表达式:

/^.*($pattern1).*\$|($pattern2).*\$/m

我应该修改它以仅在 [detailOutput] => wsTransactionDetailOutput Object(

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用2个捕获组。首先匹配[detailOutput]部分,然后匹配所有不以authorizationCode开头的行,并捕获authorizationCode和amount的值。

^\h*\[detailOutput] => .*(?:\R(?!\h*\[authorizationCode]).*)*\R\h*(\[authorizationCode] => \d+)(?:\R(?!\h*\[amount]).*)*\R\h*(\[amount] => \d+)

说明

  • ^字符串的开头
  • \h*\[detailOutput] => .*匹配[detailOutput] => ,后跟其余的行
  • (?:\R(?!\h*\[authorizationCode]).*)*重复匹配所有以[authorizationCode]开头的行
  • \R\h*匹配unicode换行符序列和0+个水平空格字符
  • (捕获第1组
    • \[authorizationCode] => \d+匹配[authorizationCode] => 和1个以上的数字
  • )关闭群组
  • (?:\R(?!\h*\[amount]).*)*\R\h*匹配所有以[amount]开头的行
  • (捕获第2组
    • \[amount] => \d+匹配[amount] => 和1个以上的数字
  • )

Regex demo | Php demo

示例代码

$contents = <<<DATA
[transactionDetails] => wsTransactionDetail Object
    (
        [sharesAmount] => 
        [sharesNumber] => 
        [amount] => 33450
        [commerceCode] => 1234567890
        [buyOrder] => 123321
    )

[detailOutput] => wsTransactionDetailOutput Object
    (
        [authorizationCode] => 001122
        [paymentTypeCode] => VD
        [responseCode] => 0
        [sharesNumber] => 0
        [amount] => 33450
        [commerceCode] => 1234567890
        [buyOrder] => 123321
    )
DATA;

$pattern = "~^\h*\[detailOutput] => .*(?:\R(?!\h*\[authorizationCode]).*)*\R\h*(\[authorizationCode] => \d+)(?:\R(?!\h*\[amount]).*)*\R\h*(\[amount] => \d+)~m";

if(preg_match_all($pattern, $contents, $matches, PREG_SET_ORDER, 0)){
    echo "Founds:\n";
    echo implode("\n", $matches[0]);
}

输出

[detailOutput] => wsTransactionDetailOutput Object
    (
        [authorizationCode] => 001122
        [paymentTypeCode] => VD
        [responseCode] => 0
        [sharesNumber] => 0
        [amount] => 33450
[authorizationCode] => 001122
[amount] => 33450