!]+)(?:\s+([^<>]*?)\s*|\s*)(\/?)>#s', function ( $matches ) {
return '<' . $matches[1] . preg_replace( '#([^\s=]+)(\=([\'"]?)(.*?)\3)?(\s+|$)#s', ' $1$2', $matches[2] ) . $matches[3] . '>';
}, str_replace( "\r", "", $input ) );
return preg_replace(
array(
// t = text
// o = tag open
// c = tag close
// Keep important white-space(s) after self-closing HTML tag(s)
'#<(img|input)(>| .*?>)#s',
// Remove a line break and two or more white-space(s) between tag(s)
'#()|(>)(?:\n*|\s{2,})(<)|^\s*|\s*$#s',
'#()|(?)\s+(<\/.*?>)|(<[^\/]*?>)\s+(?!\<)#s',
// t+c || o+t
'#()|(<[^\/]*?>)\s+(<[^\/]*?>)|(<\/.*?>)\s+(<\/.*?>)#s',
// o+o || c+c
'#()|(<\/.*?>)\s+(\s)(?!\<)|(?)\s+(\s)(<[^\/]*?\/?>)|(<[^\/]*?\/?>)\s+(\s)(?!\<)#s',
// c+t || t+o || o+t -- separated by long white-space(s)
'#()|(<[^\/]*?>)\s+(<\/.*?>)#s',
// empty tag
'#<(img|input)(>| .*?>)<\/\1>#s',
// reset previous fix
'#( ) (?![<\s])#',
// clean up ...
'#(?<=\>)( )(?=\<)#',
// --ibid
// Remove HTML comment(s) except IE and noindex comment(s)
'#\s*\s*|(?)\n+(?=\<[^!])#s',
//'#\s*\s*|(?)\n+(?=\<[^!])#s' - noindex fix
),
array(
'<$1$2$1>',
'$1$2$3',
'$1$2$3',
'$1$2$3$4$5',
'$1$2$3$4$5$6$7',
'$1$2$3',
'<$1$2',
'$1 ',
'$1',
""
),
$input );
}
}