在無法安裝 SimpleXML、DOMDocument、XMLReader 等擴展的受限環境 (極少見),或需快速提取固定結構 XML 片段時,正則表達式可作為應急方案。**強烈建議有擴展環境優先使用標準 XML 解析器**,正則解析 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 使結果按匹配順序組織,便於遍歷。| 缺陷 | 示例導致失敗的情況 |
|---|---|
| 屬性忽略 | 正則無法提取屬性 |
| 命名空間 | 標簽名含冒號 |
| CDATA 區塊 | 內容含尖括號被誤匹配 |
| 實體引用 | < > & 需額外解碼 |
| 巢狀同名標簽 | 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,健壯性、可維護性、性能全面碾壓正則。