PHPを介してXMLを自動的にインデントするための次のコードがあります。
function xmlpp($xml, $html_output=false) {
if ($xml == '') return 'NULL';
try {
$xml_obj = @new SimpleXMLElement($xml);
} catch (Exception $ex) {
// Error parsing xml, return same string
return ($html_output) ? htmlentities($xml) : $xml;
}
$level = 4;
$indent = 0; // current indentation level
$pretty = array();
// get an array containing each XML element
$xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml_obj->asXML()));
// shift off opening XML tag if present
if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) {
//$pretty[] = array_shift($xml);
array_shift($xml);
}
foreach ($xml as $el) {
if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) {
// opening tag, increase indent
$pretty[] = str_repeat(' ', $indent) . $el;
$indent += $level;
} else {
if (preg_match('/^<\/.+>$/', $el)) {
$indent -= $level; // closing tag, decrease indent
}
if ($indent < 0) {
$indent += $level;
}
$pretty[] = str_repeat(' ', $indent) . $el;
}
}
$xml = implode("\n", str_replace('"', "'", $pretty));
return ($html_output) ? htmlentities($xml, ENT_COMPAT, 'UTF-8') : $xml;
}
問題は、文字を含む属性値を取得するたびに/
、インデントレベルが低下することです。たとえば、次の出力は正しくありません。
<function desc='Cancel/Refund'>
<const value='1'/>
<const value='1'/>
<const value='1'/>
</function>
正規表現がCancel/Refudという単語と一致してはならないことは知っていますが、一致しているため、これを修正する方法がわかりません。
ヒントをいただければ幸いです。