为了账号安全,请及时绑定邮箱和手机立即绑定

需要正则表达式模式从日志文件中提取 xml 请求和响应

需要正则表达式模式从日志文件中提取 xml 请求和响应

PHP
翻过高山走不出你 2021-10-15 17:49:59
我有一个包含多个 xml 请求和响应的日志文件。我需要解析每个设置的请求/响应。由于我有限的正则表达式经验,我一直在尝试提出一个正则表达式模式来使用https://regex101.com/解析每组请求/响应,但我没有运气并决定我需要寻求一些帮助.我正在使用 Linux PHP 7.1。我的 xml 日志文件如下所示:`***********************************************************************API Client Address: 1.1.1.1Begin API Request: 7/18/2019 11:45:42 AMcontent-length:xxx<?xml version="1.0"?><MYXML>  <header/>  <body>    <data_block>          </data_block>  </body></MYXML>************************************************************************End API Response: 7/1/2019 10:17:06 AMContent-Length: 502<?xml version="1.0"?><MYXML>    <header></header>    <body>        <data_block>                    </data_block>    </body></MYXML>************************************************************************API Client Address: 1.1.1.1Begin API Request: 7/18/2019 11:45:42 AMcontent-length:xxx<?xml version="1.0"?><MYXML>  <header/>  <body>    <data_block>          </data_block>  </body></MYXML>************************************************************************End API Response: 7/1/2019 10:17:06 AMContent-Length: 502<?xml version="1.0"?><MYXML>    <header></header>    <body>        <data_block>                    </data_block>    </body></MYXML>************************************************************************API Client Address: 1.1.1.1Begin API Request: 7/18/2019 11:45:42 AMcontent-length:xxx<?xml version="1.0"?><MYXML>  <header/>  <body>    <data_block>          </data_block>  </body></MYXML>************************************************************************End API Response: 7/1/2019 10:17:06 AMContent-Length: 502<?xml version="1.0"?><MYXML>    <header></header>    <body>        <data_block>                    </data_block>    </body></MYXML>`我需要提取每组请求/响应,以便我可以解析每组测试响应以查看是否发生错误。
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

你不需要正则表达式来做到这一点。您可以使用 strtok() ( https://www.php.net/manual/en/function.strtok.php )等基本字符串操作将响应标记为数组。然后您可以解析每个响应的 XML。

您可以使用的另一个字符串操作是:explode() https://www.php.net/manual/en/function.explode.php

哦,我假设您不想花时间编写 XML 解析器。谷歌有关在 PHP 中解析 XML 的信息或库。重新发明轮子是没有意义的。


查看完整回答
反对 回复 2021-10-15
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

从您的文件中,您可以使用以下表达式提取 xml 部分:


^<\?xml version="1.0"\?>(?:\r?\n(?!</MYXML>).*)*\r?\n</MYXML>$

正则表达式演示| php 演示


从匹配中您可以提取这些部分并使用simplexml_load_file或使用DOMDocument和例如DOMXPath来获取您的值。


例如:


$str = "...";

$re = '~^<\?xml version="1.0"\?>(?:\r?\n(?!</MYXML>).*)*\r?\n</MYXML>$~m';

preg_match_all($re, $str, $matches);


foreach ($matches[0] as $match) {

    $dom = new DOMDocument();

    $dom->loadXML($match);

    $xpath = new DOMXPath($dom);

    $val = $xpath->query("/MYXML/body/data_block")->item(0)->nodeValue;

    echo $val . PHP_EOL;

}


查看完整回答
反对 回复 2021-10-15
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信