preg_match_all 没有 return 结果
preg_match_all doesn't return a result
我想在PHP中通过正则表达式匹配将字符串解析为数据集。
这是我的代码:
$string = "?\t\t\t\t\t\t?\t\t\t\t\t\t\t\t\t\t\t\t<?xml version=\"1.0\" encoding=\"UTF-8\"?><documents><Resp><gatewayId>g10060<\/gatewayId><accountId>310198232<\/accountId><orderNo>0970980541000510490500480<\/orderNo><tId><\/tId><tAmt>20<\/tAmt><result>1<\/result><respCode>21<\/respCode><signMD5>7ecd1eb9b870aaba3bfa45892095194e<\/signMD5><\/Resp><\/documents>";
preg_match_all('/<(.*?)>(.*?)<\/(.*?)>/', $string, $arr);
echo json_encode($arr);
然而它只是 returns 我 [[],[],[],[]]
,作为空数组。我已经在 https://regex101.com/ 上尝试了正则表达式,它显示了正确的结果,但它在我的服务器上不起作用。
我想要的是:
[ "gatewayId" => "g10060",
"accountId" => "310198232",
"orderNo" => "0970980541000510490500480",
"tId" => "",
"tAmt" => "20",
"result" => "1",
"respCode" => "21",
"signMD5" => "7ecd1eb9b870aaba3bfa45892095194e" ]
我该如何解决这个问题?
首先,正则表达式不是解析 XML 字符串的最佳解决方案。我认为使用 SimpleXml 会容易得多。
$object = new SimpleXMLElement($xmlString);
我已阅读您的评论。
如果我是你,我会尝试清理 XML 并将其用作 XML.. 如果某些内容发生变化,你将最终 运行 通过更改正则表达式规则来圆圈在响应中。 Trim,将其替换为有效的 XML 或 .... 也许您可以尝试直接从源
获取有效的 XML
您需要对反斜杠进行两次转义。它还有助于使用 non-slash 分隔符以提高可读性:
preg_match_all('~<(.*?)>(.*?)<\\/(.*?)>~', $string, $arr);
使用:
<?php
$string = "?\t\t\t\t\t\t?\t\t\t\t\t\t\t\t\t\t\t\t<?xml version=\"1.0\" encoding=\"UTF-8\"?><documents><Resp><gatewayId>g10060<\/gatewayId><accountId>310198232<\/accountId><orderNo>0970980541000510490500480<\/orderNo><tId><\/tId><tAmt>20<\/tAmt><result>1<\/result><respCode>21<\/respCode><signMD5>7ecd1eb9b870aaba3bfa45892095194e<\/signMD5><\/Resp><\/documents>";
preg_match_all('#<([^\?>]+)>([^<]+)<\\/[^>]+>#', $string, $arr);
list($_, $tags, $values)= $arr;
// As @billynoah said it's much less code
$result = array_combine($tags, $values);
/*
* Old inefficient code commented
*
$result = array_reduce(array_keys($tags), function($carry, $key) use ($tags, $values){
$k = $tags[$key];
$v = $values[$key];
$carry[$k] = $v;
return $carry;
},[]);
*/
var_dump($result);
结果:
array(7) {
["gatewayId"] => string(6) "g10060"
["accountId"] => string(9) "310198232"
["orderNo"] => string(25) "0970980541000510490500480"
["tAmt"] => string(2) "20"
["result"] => string(1) "1"
["respCode"] => string(2) "21"
["signMD5"] => string(32) "7ecd1eb9b870aaba3bfa45892095194e"
}
我想在PHP中通过正则表达式匹配将字符串解析为数据集。 这是我的代码:
$string = "?\t\t\t\t\t\t?\t\t\t\t\t\t\t\t\t\t\t\t<?xml version=\"1.0\" encoding=\"UTF-8\"?><documents><Resp><gatewayId>g10060<\/gatewayId><accountId>310198232<\/accountId><orderNo>0970980541000510490500480<\/orderNo><tId><\/tId><tAmt>20<\/tAmt><result>1<\/result><respCode>21<\/respCode><signMD5>7ecd1eb9b870aaba3bfa45892095194e<\/signMD5><\/Resp><\/documents>";
preg_match_all('/<(.*?)>(.*?)<\/(.*?)>/', $string, $arr);
echo json_encode($arr);
然而它只是 returns 我 [[],[],[],[]]
,作为空数组。我已经在 https://regex101.com/ 上尝试了正则表达式,它显示了正确的结果,但它在我的服务器上不起作用。
我想要的是:
[ "gatewayId" => "g10060",
"accountId" => "310198232",
"orderNo" => "0970980541000510490500480",
"tId" => "",
"tAmt" => "20",
"result" => "1",
"respCode" => "21",
"signMD5" => "7ecd1eb9b870aaba3bfa45892095194e" ]
我该如何解决这个问题?
首先,正则表达式不是解析 XML 字符串的最佳解决方案。我认为使用 SimpleXml 会容易得多。
$object = new SimpleXMLElement($xmlString);
我已阅读您的评论。 如果我是你,我会尝试清理 XML 并将其用作 XML.. 如果某些内容发生变化,你将最终 运行 通过更改正则表达式规则来圆圈在响应中。 Trim,将其替换为有效的 XML 或 .... 也许您可以尝试直接从源
获取有效的 XML您需要对反斜杠进行两次转义。它还有助于使用 non-slash 分隔符以提高可读性:
preg_match_all('~<(.*?)>(.*?)<\\/(.*?)>~', $string, $arr);
使用:
<?php
$string = "?\t\t\t\t\t\t?\t\t\t\t\t\t\t\t\t\t\t\t<?xml version=\"1.0\" encoding=\"UTF-8\"?><documents><Resp><gatewayId>g10060<\/gatewayId><accountId>310198232<\/accountId><orderNo>0970980541000510490500480<\/orderNo><tId><\/tId><tAmt>20<\/tAmt><result>1<\/result><respCode>21<\/respCode><signMD5>7ecd1eb9b870aaba3bfa45892095194e<\/signMD5><\/Resp><\/documents>";
preg_match_all('#<([^\?>]+)>([^<]+)<\\/[^>]+>#', $string, $arr);
list($_, $tags, $values)= $arr;
// As @billynoah said it's much less code
$result = array_combine($tags, $values);
/*
* Old inefficient code commented
*
$result = array_reduce(array_keys($tags), function($carry, $key) use ($tags, $values){
$k = $tags[$key];
$v = $values[$key];
$carry[$k] = $v;
return $carry;
},[]);
*/
var_dump($result);
结果:
array(7) {
["gatewayId"] => string(6) "g10060"
["accountId"] => string(9) "310198232"
["orderNo"] => string(25) "0970980541000510490500480"
["tAmt"] => string(2) "20"
["result"] => string(1) "1"
["respCode"] => string(2) "21"
["signMD5"] => string(32) "7ecd1eb9b870aaba3bfa45892095194e"
}