簡體   English   中英

需要Regex模式從日志文件中提取xml請求和響應

[英]Need Regex pattern to extract xml request and responses from log file

我有一個包含多個xml請求和響應的日志文件。 我需要解析每個設置的請求/響應。 由於我有限的regex經驗,我一直在嘗試提出一個regex模式,以使用https://regex101.com/解析每組請求/響應,但是我沒有運氣,因此決定需要尋求幫助。

我正在使用Linux PHP 7.1。

我的xml日志文件如下所示:

***********************************************************************
API Client Address: 1.1.1.1
Begin API Request: 7/18/2019 11:45:42 AM
content-length:xxx

<?xml version="1.0"?>
<MYXML>
  <header/>
  <body>
    <data_block>      
    </data_block>
  </body>
</MYXML>


************************************************************************
End API Response: 7/1/2019 10:17:06 AM
Content-Length: 502

<?xml version="1.0"?>
<MYXML>
    <header></header>
    <body>
        <data_block>            
        </data_block>
    </body>
</MYXML>

************************************************************************
API Client Address: 1.1.1.1
Begin API Request: 7/18/2019 11:45:42 AM
content-length:xxx

<?xml version="1.0"?>
<MYXML>
  <header/>
  <body>
    <data_block>      
    </data_block>
  </body>
</MYXML>


************************************************************************
End API Response: 7/1/2019 10:17:06 AM
Content-Length: 502

<?xml version="1.0"?>
<MYXML>
    <header></header>
    <body>
        <data_block>            
        </data_block>
    </body>
</MYXML>

************************************************************************
API Client Address: 1.1.1.1
Begin API Request: 7/18/2019 11:45:42 AM
content-length:xxx

<?xml version="1.0"?>
<MYXML>
  <header/>
  <body>
    <data_block>      
    </data_block>
  </body>
</MYXML>


************************************************************************
End API Response: 7/1/2019 10:17:06 AM
Content-Length: 502

<?xml version="1.0"?>
<MYXML>
    <header></header>
    <body>
        <data_block>            
        </data_block>
    </body>
</MYXML>

`

我需要提取每組請求/響應,以便我可以分析測試響應的每組以查看是否發生錯誤。

您不需要正則表達式即可執行此操作。 您可以使用基本的字符串操作(例如strtok()( https://www.php.net/manual/zh/function.strtok.php ))將響應標記化為數組。 然后,您可以從每個響應中解析XML。

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

哦,我假設您不想花時間編寫XML解析器。 Google提供信息或有關在PHP中解析XML的庫。 重新發明輪子毫無意義。

從文件中,您可以使用類似以下的表達式來提取xml部分:

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

正則表達式演示 | PHP演示

從匹配項中,您可以提取那些部分並使用simplexml_load_file或將DOMDocumentDOMXPath等配合使用來獲取值。

例如:

$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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM