用正则表达式格式化xml代码

前端之家收集整理的这篇文章主要介绍了用正则表达式格式化xml代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <Meta http-equiv=content-type content="text/html; charset=UTF-8">
    <title>Xml格式化工具</title>
    <script type="text/javascript">
		String.prototype.removeLineEnd = function(){
			return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g,'$1 $2')
		}
		function formatXml(text)
		{
			/*
			 * 功能:去掉多余的空格
			 * 
			 * $0为正则表达式/(<\w+)(\s.*?>)/g匹配到的字符串
			 * name为正则表达式(<\w+)匹配到的字符串
			 * props为正则表达式(\s.*?>)匹配到的字符串
			 */
			text = '\n' + text.replace(/(<\w+)(\s.*?>)/g,function($0,name,props){
				//alert('$0='+$0+',name='+name+',props='+props);
				//alert(name + ' ' + props.replace(/\s+(\w+)/g," $1"));
				return name + ' ' + props.replace(/\s+(\w+)/g," $1");
			}).replace(/>\s*?</g,">\n<");
			
			//把注释编码
			text = text.replace(/\n/g,'\r').replace(/<!--(.+?)-->/g,text)
			{
				var ret = '<!--' + escape(text) + '-->';
				//alert(ret);
				return ret;
			}).replace(/\r/g,'\n');
			
			//调整格式
			var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
			var nodeStack = [];
			var output = text.replace(rgx,all,isBegin,isCloseFull1,isCloseFull2,isFull1,isFull2){
				var isClosed = (isCloseFull1 == '/') || (isCloseFull2 == '/' ) || (isFull1 == '/') || (isFull2 == '/');
				//alert([all,isClosed].join('='));
				var prefix = '';
				if(isBegin == '!')
				{
					prefix = getPrefix(nodeStack.length);
				}
				else 
				{
					if(isBegin != '/')
					{
						prefix = getPrefix(nodeStack.length);
						if(!isClosed)
						{
							nodeStack.push(name);
						}
					}
					else
					{
						nodeStack.pop();
						prefix = getPrefix(nodeStack.length);
					}

				
				}
					var ret =  '\n' + prefix + all;
					return ret;
			});
        
			var prefixSpace = -1;
			var outputText = output.substring(1);
			//alert(outputText);
			
			//把注释还原并解码,调格式
			outputText = outputText.replace(/\n/g,'\r').replace(/(\s*)<!--(.+?)-->/g,prefix,text)
			{
				//alert(['[',']=',prefix.length].join(''));
				if(prefix.charAt(0) == '\r')
					prefix = prefix.substring(1);
				text = unescape(text).replace(/\r/g,'\n');
				var ret = '\n' + prefix + '<!--' + text.replace(/^\s*/mg,prefix ) + '-->';
				//alert(ret);
				return ret;
			});
			
			return outputText.replace(/\s+$/g,'').replace(/\r/g,'\r\n');

		}

    function getPrefix(prefixIndex)
    {
        var span = '    ';
        var output = [];
        for(var i = 0 ; i < prefixIndex; ++i)
        {
            output.push(span);
        }
        
        return output.join('');
    }        
        function btnFormat_click()
        {
            var $ = document.getElementById;
            $('output').value = formatXml($('input').value);
        }
        
    </script>
    
    
</head>

<body>
    <textarea id="input" style="width:100%;height:45%;">
		<a id="test" name="nn"		><b>b</b><c>c</c></a>
	</textarea>
    <div style="margin:0px auto;"><input type="button" id="btnFormat" onclick="btnFormat_click()" value="格式化" style="width:50%;height:10%;"/></div>
    <textarea id="output" style="width:100%;height:45%;"></textarea>

</body>
</html>
原文链接:https://www.f2er.com/regex/361152.html

猜你在找的正则表达式相关文章