0

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という単語と一致してはならないことは知っていますが、一致しているため、これを修正する方法がわかりません。

ヒントをいただければ幸いです。

4

1 に答える 1

1
<[^\/].+[^\/]>

正規表現の最初と最後にあるは、で始まらず、で終わら[^\/]ないタグ​​に一致することを示しています。この方法では、開始タグのみを取得し、終了タグや空のタグは取得しません。は何にでも一致するので、タグ属性の中にあるかどうかは関係ありません。ただし、開始または終了しない限りは関係ありません。//.+//

于 2012-04-22T08:54:57.567 に答える