【问题标题】:Replace cdata tags in xml替换xml中的cdata标签
【发布时间】:2013-07-03 19:01:15
【问题描述】:

我有一个字符串,里面可能有多个 cdata 标签:

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

我正在使用 javascript/jquery,我需要删除多个 cdata 标签(将它们替换为“”)。

我怎么能用正则表达式写这个?

【问题讨论】:

  • 试图用正则表达式来做这件事会导致疯狂。见this answer
  • 您想只删除&lt;![CDATA[ 及其结束]]&gt;,还是包括标签内的文本在内的所有内容?
  • 我只想删除所有出现的 cdata 标签,使用这个: string.replace("", "");只会删除一个。
  • 为什么?如果 CDATA 中的文本包含任何 &lt;&gt; 字符,则您的 XML 将不再有效。如果要删除 CDATA,还必须对包含的文本进行编码。

标签: xml regex cdata


【解决方案1】:

@Jim Garrison 在上面的评论中是正确的:没有办法稳健地 用正则表达式解析 XML/HTML。语言太复杂,无法用正则表达式表示。

但是,这并不意味着您不能编写一个涵盖最合理情况的正则表达式,这可能足以满足您的需求。例如,以下 JavaScript 正则表达式将主要执行您想要的操作:

input.replace( /<!\[CDATA\[.*?\]\]>/g, '' );

此正则表达式中有两点值得注意: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"

另一件事是我们使用g 标志来指示应该替换所有匹配项。否则只会替换第一个匹配项。

阅读 cmets,看起来您可能只想简单地去除 CDATA 标记,同时保持其内容不变。正如@Jim Garrison 在上面指出的那样,这是一个坏主意,因为您很容易留下无效的HTML;这就是 CDATA 的全部意义所在。但是,如果您确实想这样做,方法如下:

'outside <![CDATA[(cdata1)]]> inside <![CDATA[(cdata2)]]> after'
    .replace( /<!\[CDATA\[(.*?)\]\]>/g, '$1' );
// yields "outside (cdata1) inside (cdata2) after"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2023-03-06
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多