function checkBalancedTags() { var text = document.getElementById( 'wpTextbox1' ).value; //check balanced tags //idea from http://blog.stevenlevithan.com/archives/get-html-summary var pattern = /<\s*(\/)?\s*(\w+)[^\/>]*(\/)?\s*>/g; var match; var openTags = []; var unclosedTags = []; //error list var unopenTags = []; //error list while( (match = pattern.exec( text ) ) ) { var closeTag = match[1]; var tagName = match[2]; var selfcloseTag = match[3]; tagName = lc(tagName); //normalize //search tag in array for( var i = 0; i < tags.length; i++ ) { if( tags[i] == tagName ) { //valid Tag if( selfcloseTag ) { continue; //nothing to do } if( closeTag ) { var index = 0; //search for open tag while( index < openTags.length && openTags[index] != tagName ) { index++; } if( index < openTags.length ) { //found a open tag while( index > 0 ) { unclosedTags.push(openTags[0]); //add first tag to error list openTags.shift() index--; } openTags.shift(); //remove current tag } else { unopenTags.push(tagName); //add current tag to error list } } else { openTags.unshift(tagName); //add current tag } } break; } } //add left open tags to error list unclosedTags = unclosedTags.concat(openTags); if( unclosedTags.length > 0 ) { /* warning - unclosed tags */ alert( "unclosed tags: " + unclosedTags ); } if( unopenTags.length > 0 ) { /* warning - unopen tags */ alert( "Unopen Tags: " + unopenTags ); } } var tags = [ //HTML 'abbr', 'b', 'br', 'big', 'blockquote', 'caption', 'center', 'cite', 'code', 'del', 'div', 'dd', 'dl', 'dt', 'em', 'font', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'ol', 'p', 'pre', 'rb', 'rp', 'rt', 'ruby', 's', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table', 'td', 'th', 'tr', 'tt', 'u', 'ul', 'var', //MediaWiki/Extension 'categorytree', 'charinsert', 'hiero', 'imagemap', 'inputbox', 'poem', 'ref', 'references', 'source', 'syntaxhighlight', 'timeline' ];