【发布时间】:2020-09-22 14:50:18
【问题描述】:
我正在尝试使用 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”在文本文件中是两次。
我需要仅在文本文件的这一部分中获取“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(
中查找模式谢谢!
【问题讨论】:
-
您可以将数据作为对象访问吗?字段的顺序是否始终相同?
-
这将为您获取值,但目前取决于订单
^\h*\[detailOutput] => .*(?:\R(?!\h*\[authorizationCode]).*)*\R\h*(\[authorizationCode] => \d+)(?:\R(?!\h*\[amount]).*)*\R\h*(\[amount] => \d+)regex101.com/r/HtF0KM/1 -
嗨@Thefourthbird,感谢您的帮助!它在您的 regex101 中完美运行,但在我的 php 代码中却不适用
-
我已经添加了一个带有示例的答案。
标签: php regex pattern-matching text-files