【问题标题】:Insert CDATA into an XML将 CDATA 插入 XML
【发布时间】:2011-11-17 23:38:50
【问题描述】:

我现在真的很着急,我正在请求 REGEX 大师的帮助! 我通过 HTTP 请求接收 XML,但我无法解析它,因为它包含一些未包装在 CDATA 部分中的特殊字符。

示例 XML:

<root>
    <node>good node</node>
    <node>bad node containing &</node>
<root>

尝试使用 simplexml_load_string($xml) 解析这个 XML 我得到:

Warning: simplexml_load_string() [function.simplexml-load-string]:
Entity: line 3: parser error : xmlParseEntityRef: no name in /..../file.php on line ##

假设坏节点不包含 &gt;&lt;,我需要一个 REGEX 将文本包装在 CDATA 部分中的节点中。我想会有一些环顾四周,我只是不能很快做到。

谢谢!

【问题讨论】:

  • 简单:$result = "&lt;![CDATA[" . $get_file_contents() . "]]&gt;"; 不需要正则表达式!
  • 那么,您没有任何方法可以让“XML”(阅读:“INVALID XML”)拥有编码实体?
  • 不幸的是,我无法访问那台计算机,所以我暂时无能为力
  • @Kerrek:我应该包装每个终端非空节点的内容。您的解决方案会将整个 xml 树作为文本返回给我 - 无法解析
  • @s3v3n:only 是否可以找到杂散的 & 符号并用实体引用替换它们?

标签: php xml regex


【解决方案1】:

如果您确实可以假设您想要 CDATA 化的节点内没有 &lt;&gt; 字符,那么这应该适合您的情况:

>(?=[^<&]*&)([^<]*)<

替换为

<!CDATA[\1]]>

此表达式仅查找包含 &amp; 字符的节点(无论它们是否是 HTML 实体的一部分),然后将这些节点的内容包装在 CDATA 标记中,如果您需要忽略实体内的 &amp; 字符,这有点难,但我愿意看看。

【讨论】:

  • 它可能会起作用 - 主要是 - 有点 - 除了一些我尚未确定的例外......:D
  • 嗨!谢谢你的帮助!我对其进行了一些修改,它使用+ 而不是第一个*,因为它与&lt;root&gt;[the blanks or nothing right here]&lt;node&gt; 匹配。这不是完美的解决方案(正如@G_H 通过提供“证明”所指出的那样),但它适用于我的特殊情况。我会恳请那些人给我一个更好、更有效的 XML。感谢您的帮助!
  • @s3v3n 我从不说永远...无论有多少人大声疾呼某些东西是反模式或最糟糕的解决方案,您几乎总能想出一些实际正确的案例。如果这对你有用,比如说,99.9% 的时间,这已经足够好了,为什么不呢?但您当然应该要求提供有效的 XML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2012-08-20
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多