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" ]

Как я могу это исправить?

1

Решение

Использование:

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

Другие решения

Вы должны дважды избежать обратной косой черты. Это также помогает использовать разделитель без косой черты для удобства чтения:

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

Прежде всего, регулярное выражение не является лучшим решением для анализа строк XML. Я думаю, что с SimpleXml было бы намного проще.

$ object = new SimpleXMLElement ($ xmlString);

Я прочитал ваши комментарии.
Если бы я был вами, я бы попытался очистить XML и использовать его в качестве XML … вы все равно будете в конечном итоге бегать кругами, изменяя правила регулярных выражений, если что-то изменится в ответе. Обрежьте, замените его на допустимый XML или …. возможно, вы можете попробовать получить действительный XML прямо из источника

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector