Here is an example I've put together using ColdFusion (and a bit of RegEx) to validate and add closing HTML tags to your content:
- <cffunction access="private" name="validateHtml" output="false" returntype="any">
- <cfargument name="html" required="true" type="string">
- <cfscript>
- var token = "[[:word:]]+|[^[:word:]<]|(?:<(\/)?([[:word:]]+)[^>]*(\/)?>)|<";
- var selfClosingTag = "^(?:[hb]r|img)$";
- var output = "";
- var tag = "";
- var openTags = "";
- var strPos = 0;
- var i = 1;
- var match = reFind( token, html, i, "true" );
- // find tags
- while( match.pos[1] ) {
- // if this is an HTML tag
- if( match.pos[3] ) {
- output &= mid( html, match.pos[1], match.len[1] );
- tag = mid( html, match.pos[3], match.len[3] );
- // if this is not a self-closing tag
- if ( !( match.pos[4] || reFindNoCase( selfClosingTag, tag ) ) ) {
- // if this is a closing tag
- if( match.pos[2] && listFindNoCase( openTags, tag ) ) {
- openTags = listDeleteAt( openTags, listFindNoCase( openTags, tag ) );
- } else {
- openTags = listAppend( openTags, tag );
- }
- }
- } else {
- output &= mid( html, match.pos[1], match.len[1] );
- }
- i += match.len[1];
- match = reFind( token, html, i, "true" );
- }
- // close any tags which were left open
- while( listLen( openTags ) ) {
- output &= "";
- openTags = listDeleteAt( openTags, listLen( openTags ) );
- }
- return output;
- </cfscript>
- </cffunction>