如何用PHP提取日志文件中XML片段的unique_id与transaction_id
PHP提取混合文本中XML片段的unique_id与transaction_id
方法一:拆分交易块后解析XML
针对这种前缀+XML片段的混合格式,先拆分独立交易单元再解析XML的方式兼容性更强:
- 读取整个文件内容到字符串;
- 利用交易开头的时间戳特征,分割出每个完整的交易块;
- 从每个块中提取XML片段,还原转义的标签字符;
- 用PHP原生XML解析工具提取目标字段。
代码示例:
$fileContent = file_get_contents('transaction_log.txt'); // 按交易起始的时间戳分割,保留每个交易的完整内容 $transactions = preg_split('/(?=^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - Transaction)/m', $fileContent); $transactions = array_filter($transactions); // 过滤空元素 $extractedData = []; foreach ($transactions as $block) { // 还原转义的XML标签,提取完整XML片段 $decodedBlock = htmlspecialchars_decode($block); if (preg_match('/(<\?xml.*?<\/payment_response>)/s', $decodedBlock, $xmlMatches)) { try { $xml = new SimpleXMLElement($xmlMatches[1]); $extractedData[] = [ 'transaction_id' => (string)$xml->transaction_id, 'unique_id' => (string)$xml->unique_id ]; } catch (Exception $e) { // 记录解析失败的交易块,避免中断流程 error_log("XML解析失败:{$e->getMessage()}\n原始块内容:{$block}"); continue; } } } // 输出提取结果 print_r($extractedData);
方法二:直接正则匹配目标字段
如果确认所有交易的XML结构完全固定,可跳过XML解析,直接用正则匹配字段,效率更高:
$fileContent = file_get_contents('transaction_log.txt'); $decodedContent = htmlspecialchars_decode($fileContent); // 批量匹配所有transaction_id和对应的unique_id preg_match_all( '/<transaction_id>(.*?)<\/transaction_id>.*?<unique_id>(.*?)<\/unique_id>/s', $decodedContent, $matches, PREG_SET_ORDER ); $extractedData = []; foreach ($matches as $match) { $extractedData[] = [ 'transaction_id' => trim($match[1]), 'unique_id' => trim($match[2]) ]; } print_r($extractedData);
关键注意点
- 必须先通过
htmlspecialchars_decode将</>还原为</>,否则正则或XML解析无法识别标签; - 加入错误捕获逻辑,避免单个格式异常的交易块导致整个脚本终止;
- 350个交易的量级极小,两种方法都能轻松处理,无需优化性能。
内容的提问来源于stack exchange,提问作者Adrian Smith
相关产品推荐
相关产品推荐

