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
<[^\/].+[^\/]>

[^\/]则表达式开头和结尾的 表示匹配不以 a 开头且不以 a/结尾的标签/。这样你只能得到开始标签而不是结束标签或空标签。将.+匹配任何内容,因此只要/标签不以/.

于 2012-04-22T08:54:57.567 回答