PHP中缩进XML输出自定义代码中的错误

PHP中缩进XML输出自定义代码中的错误,php,regex,debugging,syntax-highlighting,Php,Regex,Debugging,Syntax Highlighting,我有以下代码用于通过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 retur

我有以下代码用于通过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;
}
我知道正则表达式不应该与单词Cancel/Refud匹配,但它确实匹配,我不知道如何解决这个问题

如有任何提示,将不胜感激


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

正则表达式开头和结尾的
[^\/]
表示匹配不以
/
开头和不以
/
结尾的标记。这样,您只会得到开始标记,而不会得到结束标记或空标记。
+
将匹配任何内容,因此,只要它不以
/

开头或结尾,标签属性中是否包含
/
,都无所谓。那么,您对哪个正则表达式模式有问题?您在那里有4个。感谢提示,我将
if(preg_match('/^\/]*>$/U',$el))
if(preg_match('/^$/U',$el))
行更改为仅匹配右括号前没有
/
的所有标记。我只是觉得如果你的答案更清楚的话会更容易。如果您编辑它以便其他人能够理解,我会将其标记为已接受。抱歉,我无法完全理解您想要的是什么,因为您没有提到您遇到问题的正则表达式模式,所以我列出了所有组合。最后一个是你想要的?只匹配
而不匹配其他的吗?我没有提到要修复哪一个,因为我不知道问题出在哪里。结果证明您更正了正确的正则表达式,从而解决了问题。我不想回答我自己的问题。这就是为什么我要说,如果你在答案上加上一点描述,我会把你的标记为正确的。
<[^\/].+[^\/]>