User Tools

Site Tools


oracle:fixhtml

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
oracle:fixhtml [2010/11/03 13:32] rlunarooracle:fixhtml [2013/04/05 18:30] rlunaro
Line 1: Line 1:
-====== Fix or Sanitize HTML code from Word ====== 
- 
-Yes: I've found the silver bullet for those of you who are seeking for a function that clean html code or sanitize it, specially if it comes from a cut and paste operation from word.  
- 
-To the point. This snippet:  
- 
-<code> 
-select dirty, strip_html(dirty) from dual;  
-</code> 
- 
-Removes all the HTML tags from the html code. But this one:  
- 
-<code> 
-select dirty, strip_html(dirty,2) from dual;  
-</code> 
- 
-Wipes out all the garbage who is in the html code, leaving it --more or less-- "clean". And yes, I am using regular expresions to perform the fixing, so it is easy to move it to java or other programming languages. And without more preamble, here is the code: 
- 
-<code plsql> 
- 
- create or replace function strip_html(dirty in clob, 
-                                      to_cvs in number default 0) 
-  return clob is out clob ; 
-   
-  type arr_string is varray (200) of varchar2(64);  
-   
-  entities_search_for arr_string;  
-  entities_replace arr_string; 
-  cont number;  
-   
-begin 
- 
- 
--- to accelerate the issue 
-if dirty is null then  
-   return dirty;  
-end if; -- isnull(dirty) 
- 
-if length( dirty ) = 0 then  
-   return dirty;  
-end if; -- length(dirty)  
- 
-entities_search_for := arr_string( 
-'&excl;', 
-'&num;', 
-'&dollar;', 
-'&percnt;', 
-'&amp;', 
-'&quot;', 
-'&lpar;', 
-'&rpar;', 
-'&midast;', 
-'&plus;', 
-'&comma;', 
-'&hyphen;', 
-'&period;', 
-'&sol;', 
-'&colon;', 
-'&semi;', 
-'&lt;', 
-'&equals;', 
-'&gt;', 
-'&quest;', 
-'&commat;', 
-'&lsqb;', 
-'&bsol;', 
-'&rsqb;', 
-'&circ;', 
-'&lowbar;', 
-'&grave;', 
-'&lcub;', 
-'&verbar;', 
-'&rcub;', 
-'&tilde;', 
-'&nbsp;', 
-'&iexcl;', 
-'&cent;', 
-'&pound;', 
-'&curren;', 
-'&yen;', 
-'&brvbar;', 
-'&sect;', 
-'&Dot;', 
-'&copy;', 
-'&ordf;', 
-'&laquo;', 
-'&not;', 
-'&shy;', 
-'&reg;', 
-'&macr;', 
-'&deg;', 
-'&plusmn;', 
-'&sup2;', 
-'&sup3;', 
-'&acute;', 
-'&micro;', 
-'&para;', 
-'&middot;', 
-'&cedil;', 
-'&sup1;', 
-'&ordm;', 
-'&raquo;', 
-'&fr;', 
-'&fr;', 
-'&fr;', 
-'&iquest;', 
-'&Agrave;', 
-'&Aacute;', 
-'&Acirc;', 
-'&Atilde;', 
-'&Auml;', 
-'&Aring;', 
-'&AElig;', 
-'&il;', 
-'&Egrave;', 
-'&Eacute;', 
-'&Ecirc;', 
-'&Euml;', 
-'&Igrave;', 
-'&Iacute;', 
-'&Icirc;', 
-'&Iuml;', 
-'&ETH;', 
-'&Ntilde;', 
-'&Ograve;', 
-'&Oacute;', 
-'&Ocirc;', 
-'&Otilde;', 
-'&Ouml;', 
-'&times;', 
-'&Oslash;', 
-'&Ugrave;', 
-'&Uacute;', 
-'&Ucirc;', 
-'&Uuml;', 
-'&Yacute;', 
-'&THORN;', 
-'&szlig;', 
-'&agrave;', 
-'&aacute;', 
-'&acirc;', 
-'&atilde;', 
-'&auml;', 
-'&egrave;', 
-'&eacute;', 
-'&ecirc;', 
-'&etilde;', 
-'&euml;', 
-'&igrave;', 
-'&iacute;', 
-'&icirc;', 
-'&itilde;', 
-'&iuml;', 
-'&ograve;', 
-'&oacute;', 
-'&ocirc;', 
-'&otilde;', 
-'&ouml;', 
-'&ugrave;', 
-'&uacute;', 
-'&ucirc;', 
-'&utilde;', 
-'&uuml;'); 
- 
-entities_replace := arr_string( 
-'¡', 
-'º', 
-'$', 
-'%', 
-'&', 
-'"', 
-'(', 
-')', 
-'*', 
-'+', 
-',', 
-'-', 
-'.', 
-'Sol', 
-'Colon', 
-'*', 
-'<', 
-'=', 
-'>', 
-'?', 
-',', 
-'*', 
-'*', 
-'*', 
-'*', 
-'_', 
-'''', 
-'*', 
-'*', 
-'*', 
-'''', 
-' ', 
-'¡', 
-'cent', 
-'L', 
-'*', 
-'Y', 
-'*', 
-'*', 
-'.', 
-'(c)', 
-'*', 
-'*', 
-'!', 
-'*', 
-'(r)', 
-'*', 
-'*', 
-'*', 
-'*', 
-'*', 
-'á', 
-'u', 
-'*', 
-'·', 
-'ç', 
-'*', 
-'*', 
-'*', 
-'*', 
-'*', 
-'*', 
-'¿', 
-'È', 
-'Á', 
-'Ä', 
-'Á', 
-'*', 
-'*', 
-'AE', 
-'*', 
-'È', 
-'É', 
-'*', 
-'*', 
-'Ì', 
-'Í', 
-'Î', 
-'*', 
-'*', 
-'N', 
-'Ò', 
-'Ó', 
-'Ô', 
-'O', 
-'*', 
-'*', 
-'O', 
-'Ù', 
-'Ú', 
-'Û', 
-'*', 
-'*', 
-'*', 
-'*', 
-'à', 
-'á', 
-'â', 
-'a', 
-'*', 
-'è', 
-'é', 
-'ê', 
-'e', 
-'*', 
-'ì', 
-'í', 
-'î', 
-'i', 
-'*', 
-'ò', 
-'ó', 
-'ô', 
-'o', 
-'*', 
-'ù', 
-'ú', 
-'û', 
-'u', 
-'*');  
- 
-  out := dirty;  
- 
-  -- replace what is enclosed between <xml> and </xml> 
-  -- *? -> lazy star (catches the minimum possible) 
-  out := regexp_replace(out, '<xml>.*?</xml>', '', 1, 0, 'ni' ); 
-  -- clean what it is inside the style tags   
-  out := regexp_replace(out, '<style>.*?</style>', '', 1, 0, 'ni' ); 
- 
-  if to_cvs = 2 then 
-     -- sanitize (not clean) the html 
- 
-     -- clean the tag <?xml:whatever> 
-     out := regexp_replace(out, '<\?xml:.*?>', '', 1, 0, 'ni'); 
-     -- clean the tags <img whatever> 
-     out := regexp_replace(out, '<img.*?>', '', 1, 0, 'ni'); 
-     -- clean comments 
-     out := regexp_replace(out,'<!--.*?-->','', 1, 0, 'ni'); 
-     -- clean meta 
-     out := regexp_replace(out,'<meta.*?>','', 1, 0, 'ni'); 
-     -- clean link 
-     out := regexp_replace(out,'<link.*?>','', 1, 0, 'ni'); 
-     -- clean DIV 
-     out := regexp_replace(out,'</?div.*?>','', 1, 0, 'ni'); 
-     -- clean SPAN 
-     out := regexp_replace(out,'</?span.*?>','', 1, 0, 'ni'); 
-     -- clean "class inside tags" 
-     out := regexp_replace(out,'(<.*?)class="?[a-zA-Z0-9-_]*"?(.*?>)', '\1\2', 1, 0, 'ni'); 
-     -- clean "style" inside the following tags: i b p 
-     out := regexp_replace(out,'(<[ibp] .*?)style=".*?"(.*?>)', '\1\2', 1, 0, 'ni'); 
-     -- clean namespaces <o:p> </o:p> 
-     out := regexp_replace(out, '(<)[a-zA-Z0-9-_]*:(.*?>)', '\1\2', 1, 0, 'ni'); 
-     out := regexp_replace(out, '(</)[a-zA-Z0-9-_]*:(.*?>)', '\1\2', 1, 0, 'ni'); 
- 
-     -- clean empty opening and closing tags: it has to be  
-     -- passed twice or three times to clean things like this:  
-     -- <strong><u></u></strong> 
-     -- TWEAK: <p></p> must be replaced by <br/> 
-     out := regexp_replace(out,'<p></p>','<br/>', 1, 0, 'ni'); 
-     out := regexp_replace(out,'<([a-zA-Z0-9-_]*)></\1>','', 1, 0, 'ni'); 
-     -- TWEAK: <p></p> must be replaced by <br/> 
-     out := regexp_replace(out,'<p></p>','<br/>', 1, 0, 'ni'); 
-     out := regexp_replace(out,'<([a-zA-Z0-9-_]*)></\1>','', 1, 0, 'ni'); 
- 
-  else 
-    -- clean html 
- 
-    -- replace all the stuff that is similar to a carriage return 
-    out := regexp_replace(out, '</p[^>]*>',chr(10)||chr(13)); 
-    out := regexp_replace(out, '</br[^>]*>',chr(10)||chr(13)); 
-    out := regexp_replace(out, '</tr[^>]*>',chr(10)||chr(13)); 
-     
-    -- replace all the remaining html stuff  
-    out := regexp_replace(out,'<[^>]*>','', 1, 0, 'ni'); 
-     
-    -- replace all the entities 
-    for cont in 1..119 loop  
-      out := replace( out, entities_search_for(cont), entities_replace(cont) ); 
-    end loop;  
-   
-    -- cleaning for export to cvs 
-    if to_cvs = 1 then  
-       out := replace( out, chr(10), '' );  
-       out := replace( out, chr(13), '' );  
-     out := replace( out, chr(9), '' );  
-       out := replace( out, ';', ',' );  
-       out := replace( out, '"', '''' );  
-    end if;  
- 
- 
-  end if;  
- 
-   
-  return(out); 
-end strip_html; 
- 
- 
- 
-</code> 
- 
- 
- 
- 
- 
  
oracle/fixhtml.txt · Last modified: 2022/12/02 22:02 by 127.0.0.1