web-dev-qa-db-ja.com

Oracle PL / SQLで<、>、&文字をHTMLエンティティにエスケープする方法

Oracle PL/SQLパッケージから直接HTMLメールを送信する必要があります。これはほとんど問題なく動作します。

テーブルからフェッチされたデータの一部に_<S>_、_<L>_、および同様のフラグメントが含まれることがあり、HTMLタグとして扱われることがあり、そうでない場合でも常に無視されて表示されません。

したがって、メールの本文に挿入する前に、この列をエスケープする必要があります。

Htmlの特殊文字をエンティティに自動的にエスケープする関数はありますか?または、すべての特殊文字を手動でreplace('<', '&lt;', string)する必要がありますか?

19
SWilk

Htf.escape_sc関数を使用できます。

SQL> select htf.escape_sc('Please escape <this> tag') from dual;

HTF.ESCAPE_SC('PLEASEESCAPE<THIS>TAG')
------------------------------------------------------------------
Please escape &lt;this&gt; tag
36
Tony Andrews

Clobを処理できるDBMS_XMLGEN.CONVERTも使用できます。

例:

select DBMS_XMLGEN.CONVERT('<foo>') from dual

詳細: https://docs.Oracle.com/cd/B19306_01/appdev.102/b14258/d_xmlgen.htm

9
Tim Funk
HTF.BDY :
/* SPECIAL FUNCTIONS */
function escape_sc(ctext in varchar2 character set any_cs)
         return varchar2 character set ctext%charset is
begin return(replace(
             replace(
             replace(
             replace(ctext, '&', '&' || 'amp;'),
                            '"', '&' || 'quot;'),
                            '<', '&' || 'lt;'),
                            '>', '&' || 'gt;'));
end;

この関数は自分で作成できます

しかし、関数dbms_xmlgen.convertのこのバリアントを使用する方が良い

SQL> select dbms_xmlgen.convert('<test>&''"</test>') from dual
  2  /

DBMS_XMLGEN.CONVERT('<TEST>&''"</TEST>')
--------------------------------------------------------------------------------
&lt;test&gt;&amp;&apos;&quot;&lt;/test&gt;
0
Pavel Safin