我正在尝试使用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(
谢谢!
答案 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个以上的数字)
示例代码
$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