内部に複数の cdata タグが含まれる可能性のある文字列があります。
<![CDATA[A Survey of Applications of Identity-Based Cryptography in Mobile Ad-Hoc Networks]]>
javascript/jquery を使用しており、複数の cdata タグを削除する必要があります ("" に置き換えます)。
これを正規表現で書くにはどうすればよいですか?
@Jim Garrison の上記のコメントは正しいです。XML/HTML を正規表現で堅牢に解析する方法はありません。言語が複雑すぎて正規表現で表現できません。
ただし、これは、ほとんどの合理的なケースをカバーする正規表現を作成できないという意味ではありません。おそらく、これで十分です。たとえば、次の JavaScript 正規表現は、ほとんどの場合、必要なことを行います。
input.replace( /<!\[CDATA\[.*?\]\]>/g, '' );
この正規表現で注目すべき 2 つの点は.*?
、CDATA 本体内のワイルドカード ( ) が?
修飾子で遅延されていることです。それがないと、次の悪いことが起こります。
'before <![CDATA[blah]]> some stuff between <![CDATA[another cdata]]> after'
.replace( /<!\[CDATA\[.*\]\]>/g, '' );
// returns "before after" when we probably
// wanted "before some stuff between after"
もう 1 つのことは、g
フラグを使用して、すべての一致を置き換える必要があることを示すことです。それ以外の場合は、最初の一致のみが置き換えられます。
コメントを読むと、コンテンツをそのまま残して CDATA タグを単純に削除したい場合があるようです。上で @Jim Garrison が指摘しているように、無効な HTML が簡単に残される可能性があるため、これは悪い考えです。それが CDATA の要点です。しかし、それをやりたい場合は、次の方法があります。
'outside <![CDATA[(cdata1)]]> inside <![CDATA[(cdata2)]]> after'
.replace( /<!\[CDATA\[(.*?)\]\]>/g, '$1' );
// yields "outside (cdata1) inside (cdata2) after"