首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 正則解析 XML:無需擴展的輕量級 XML 數據提取方案

     編輯:PHP 相關知識

適用場景

在無法安裝 SimpleXML、DOMDocument、XMLReader 等擴展的受限環境 (極少見),或需快速提取固定結構 XML 片段時,正則表達式可作為應急方案。**強烈建議有擴展環境優先使用標準 XML 解析器**,正則解析 XML 存在嚴重局限性 (見文末)。

示例 XML (person.xml)

<?xml version="1.0" encoding="UTF-8"?>
<humans>
  <zhangying>
    <name>張映</name>
    <sex>男</sex>
    <old>28</old>
  </zhangying>
  <tank>
    <name>tank</name>
    <sex>男</sex>
    <old>28</old>
  </tank>
</humans>

正則提取代碼

<?php
$xml = '';
$f = fopen('person.xml', 'r');
while ($data = fread($f, 4096)) $xml .= $data;
fclose($f);

// 1. 獲取最外層  內容
preg_match('/(.*?)<\/humans>/s', $xml, $m);
$humansContent = $m[1] ?? '';

// 2. 循環提取每個子節點 (zhangying, tank)
preg_match_all('/<(\w+)>(.*?)<\/\1>/s', $humansContent, $persons, PREG_SET_ORDER);

foreach ($persons as $person) {
    $tagName = $person[1]; // zhangying, tank
    $content = $person[2];

    // 3. 提取具體字段
    $name = preg_match('/(.*?)<\/name>/', $content, $m) ? $m[1] : '';
    $sex  = preg_match('/(.*?)<\/sex>/',  $content, $m) ? $m[1] : '';
    $old  = preg_match('/(.*?)<\/old>/',  $content, $m) ? $m[1] : '';

    echo "{$name} - {$sex} - {$old}<br>";
}
?>

正則關鍵點解析

  • /s 修飾符 (PCRE_DOTALL):讓 . 匹配換行符,實現跨行匹配。
  • (.*?) 非貪婪匹配:盡可能少匹配字符,避免吞掉後續標簽。
  • <(\w+)>(.*?)<\/\1> 反向引用:匹配成對的開始/結束標簽,提取任意標簽名。 PREG_SET_ORDER 使結果按匹配順序組織,便於遍歷。

⚠️ 正則解析 XML 的致命缺陷 (必讀)

缺陷示例導致失敗的情況
屬性忽略張映 正則無法提取屬性
命名空間... 標簽名含冒號
CDATA 區塊b]]> 內容含尖括號被誤匹配
實體引用&lt; &gt; &amp; 需額外解碼
巢狀同名標簽inner 非貪婪仍可能錯配
註釋/處理指令 被誤作為內容
編碼聲明非 UTF-8 文件讀取後亂碼

標準解析器對比 (推薦使用)

<?php
// SimpleXML (最簡單)
$xml = simplexml_load_file('person.xml');
foreach ($xml->children() as $person) {
    echo "{$person->name} - {$person->sex} - {$person->old}
"; } // DOMDocument (功能最全) $dom = new DOMDocument(); $dom->load('person.xml'); $xpath = new DOMXPath($dom); foreach ($xpath->query('/humans/*') as $node) { $name = $xpath->evaluate('string(name)', $node); $sex = $xpath->evaluate('string(sex)', $node); $old = $xpath->evaluate('string(old)', $node); echo "{$name} - {$sex} - {$old}
"; } // XMLReader (流式,超大文件) $reader = new XMLReader(); $reader->open('person.xml'); while ($reader->read()) { if ($reader->nodeType == XMLReader::ELEMENT && in_array($reader->name, ['name','sex','old'])) { // 處理... } } ?>

總結

正則解析 XML **僅限**於:結構極其固定、無屬性/命名空間/CDATA、一次性腳本、無擴展環境。任何正式項目**必須**使用 SimpleXML、DOMDocument 或 XMLReader,健壯性、可維護性、性能全面碾壓正則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved