preg_match_all不会返回结果

时间:2017-02-20 02:32:31

标签: php regex preg-match-all

我想通过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);

然而它只返回我[[],[],[],[]],作为空数组。我在https://regex101.com/上尝试了正则表达式,它向我显示了正确的结果,但它在我的服务器上无效。

我想要的是:

[ "gatewayId" => "g10060",
  "accountId" => "310198232",
  "orderNo" => "0970980541000510490500480",
  "tId" => "",
  "tAmt" => "20",
  "result" => "1",
  "respCode" => "21",
  "signMD5" => "7ecd1eb9b870aaba3bfa45892095194e" ]

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

使用:

<?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"
}

答案 1 :(得分:3)

你需要双重逃避反斜杠。它还有助于使用非斜杠分隔符来提高可读性:

preg_match_all('~<(.*?)>(.*?)<\\\/(.*?)>~', $string, $arr);

答案 2 :(得分:2)

首先,正则表达式不是解析XML字符串的最佳解决方案。我认为使用SimpleXml会更容易。

$ object = new SimpleXMLElement($ xmlString);

我已经阅读了你的评论。 如果我是你,我会尝试清理XML并将其用作XML ..无论如何,如果响应中的某些内容发生更改,您将最终通过更改正则表达式规则来运行。修剪,替换使其成为有效的XML或....也许您可以尝试直接从源

获取有效的XML