5

内部に複数の cdata タグが含まれる可能性のある文字列があります。

<![CDATA[A Survey of Applications of Identity-Based Cryptography in Mobile Ad-Hoc Networks]]>

javascript/jquery を使用しており、複数の cdata タグを削除する必要があります ("" に置き換えます)。

これを正規表現で書くにはどうすればよいですか?

4

1 に答える 1

6

@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"
于 2013-07-05T17:20:48.203 に答える