php-如何从具有等号=且没有preg_match的字符串值的数组中提取值

乔希

我已经收到来自服务器的字符串响应,我将其转换为数组,但仍然无法确定如何从该数组访问值,例如

myarrray['txn_status'];

也来自字符串 clnt_rqst_meta

array(13) {
  [0]=>
  string(15) "txn_status=0399"
  [1]=>
  string(15) "txn_msg=failure"
  [2]=>
  string(55) "txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161"
  [3]=>
  string(17) "clnt_txn_ref=9178"
  [4]=>
  string(15) "tpsl_bank_cd=NA"
  [5]=>
  string(19) "tpsl_txn_id=T245107"
  [6]=>
  string(14) "txn_amt=121.00"
  [7]=>
  string(47) "clnt_rqst_meta={mob:9937253528}{custname:pawan}"
  [8]=>
  string(16) "tpsl_txn_time=NA"
  [9]=>
  string(15) "tpsl_rfnd_id=NA"
  [10]=>
  string(10) "bal_amt=NA"
  [11]=>
  string(47) "rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0"
  [12]=>
  string(45) "hash=3cf25909ec73865d3200bc267119d3fcc21df463"
}

我知道使用regex / preg_match可以实现相同的目的,但是我确信必须有一些简单的方法来实现。

更新:从响应收到的实际字符串是这样的:

string(342) "txn_status=0399|txn_msg=failure|txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161|clnt_txn_ref=9178|tpsl_bank_cd=NA|tpsl_txn_id=T245107|txn_amt=121.00|clnt_rqst_meta={mob:9937253528}{custname:pawan}|tpsl_txn_time=NA|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0|hash=3cf25909ec73865d3200bc267119d3fcc21df463" 

所以我用 $response =explode("|",$response_str);

缺氧

您可以让PHP函数parse_str()为您完成繁重的工作,但它希望收到一个标准查询字符串,其中的条目用分隔&您输入的字符串使用了另一个分隔符(|),parse_str()并且没有提供一种方法来告诉它使用哪个字符作为分隔符。

这个问题有一个非常简单的解决方案:在输入字符串中使用str_replace()replace |&然后将结果传递给parse_str()

$input = 'txn_status=0399|txn_msg=failure|txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161|clnt_txn_ref=9178|tpsl_bank_cd=NA|tpsl_txn_id=T245107|txn_amt=121.00|clnt_rqst_meta={mob:9937253528}{custname:pawan}|tpsl_txn_time=NA|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0|hash=3cf25909ec73865d3200bc267119d3fcc21df463';
parse_str(str_replace('|', '&', $input), $output);

print_r($output);

它产生:

Array
(
    [txn_status] => 0399
    [txn_msg] => failure
    [txn_err_msg] => Transaction Cancelled : ERROR CODE TPPGE161
    [clnt_txn_ref] => 9178
    [tpsl_bank_cd] => NA
    [tpsl_txn_id] => T245107
    [txn_amt] => 121.00
    [clnt_rqst_meta] => {mob:9937253528}{custname:pawan}
    [tpsl_txn_time] => NA
    [tpsl_rfnd_id] => NA
    [bal_amt] => NA
    [rqst_token] => cd3f6f55-5990-4c3b-bb12-238eede827a0
    [hash] => 3cf25909ec73865d3200bc267119d3fcc21df463
)

实际观看:https//3v4l.org/KBaof

警告

仅当输入字符串不包含&和时,以上公开的解决方案才能正常工作%这些字符是查询字符串中的特殊字符,请parse_str()尝试使用其特殊含义来解释它们,并且上面的代码会中断。

输入字符串中存在&或时%存在的解决方案

$input = 'txn_status=0399|txn_msg=failure|txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161|clnt_txn_ref=9178|tpsl_bank_cd=NA|tpsl_txn_id=T245107|txn_amt=121.00|clnt_rqst_meta={mob:9937253528}{custname:pawan}|tpsl_txn_time=NA|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0|hash=3cf25909ec73865d3200bc267119d3fcc21df463';
$output = array_reduce(
    explode('|', $input),
    function($acc, $item) {
        list($key, $value) = explode('=', $item, 2);
        $acc[$key] = $value;
        return $acc;
    },
    []
);

print_r($output);

如果|值中存在(例如...|txn_err_msg=a|b|clnt_txn_ref=...),它仍然会失败,但是由于输入字符串的幼稚编码,因此此问题没有解决方案。

如果您可以修改生成输入数据的服务器,请对其进行更改以生成JSON输出。JSON是一种允许验证输入字符串的格式,PHP提供了编码解码功能双方的代码变得更加清晰。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用PHP rexep或preg_match从字符串中提取字母和数字

如何在 PHP 中使用 preg_match 从字符串创建数组

如何从php中的字符串中提取值

php preg_match验证字符串是否为alpha或有空格

具有preg_match的PHP多维数组搜索

如何在PHP中使用regex或preg_match将字符串的精确部分提取为变量?

如何在PHP中使用preg_replace或preg_match移动子字符串?

在PHP中使用preg_match在带有我的模式字符串的那一行之后获取行

PHP Preg_match一个字符串中有多个项目?

preg_match一个带有单引号或双引号的php字符串,转义于其中

PHP:如何使用破折号和方括号之间的所有内容分割字符串。(preg_split或preg_match)

如何使用Php從具有特定開始和結束位置的字符串中提取數據?

如何获取最后一个preg_match函数导致PHP中的字符串

PHP 如何使用 preg_match 匹配字符串中的精确数字和符号?

如何在 JavaScript 中将具有等号“=”符号的字符串转换为 json

使用字符串从数组PHP中提取值

如何从具有动态值的字符串中提取数组?

如何通过可能具有浮点值且没有适当的等号的成员比较两个对象?

PHP preg_match没有得到匹配

在PHP中提取字符串的子字符串的最有效方法

如何从没有Key的JSON字符串中提取值?

有没有更简洁的方法可以使用 RegEx 从 PHP 中的字符串中提取子字符串?

如何在 PHP 中从带有 preg_match_all 的字符串返回 JavaScript?

如何在PHP中将“具有数组格式的字符串”转换为数组?

如何从Java中具有不同值的字符串中提取子字符串?

如何在php preg_match中消除花括号之间的字符串和特殊字符

PHP:如何从(多字节)字符串中提取所有预定义的子字符串?

如何在PHP中遍历具有多个数组值的多个字符串?

PHP字符串没有保存到数组中