正则表达式匹配出现在XML节点内的">","<","&"字符

Cam*_*oft 10 php regex xml

我正在尝试使用PHP中的PCRE库编写正则表达式.

我需要一个正则表达式匹配&,>以及<任何XML节点的字符串部分中存在的字符,而不是标签声明本身.

输入XML:

<pnode>
  <cnode>This string contains > and < and & chars.</cnode>
</pnode>
Run Code Online (Sandbox Code Playgroud)

我们的想法是搜索并替换这些字符并将它们转换为XML实体等价物.

如果我要将整个XML转换为实体,那么XML将如下所示:

整个XML转换为实体

&lt;pnode&gt;
  &lt;cnode&gt;This string contains &gt; and &lt; and &amp; chars.&lt;/cnode&gt;
&lt;/pnode&gt;
Run Code Online (Sandbox Code Playgroud)

我需要它看起来像这样:

正确的XML

<pnode>
  <cnode>This string contains &gt; and &lt and &amp; chars.</cnode>
</pnode>
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用look-ahaead编写一个正则表达式来匹配这些字符,但我不知道如何使它工作.我的尝试(目前只尝试匹配>符号):

/>(?=[^<]*<)/g
Run Code Online (Sandbox Code Playgroud)

只是为了说清楚我试图解决的XML来自第三方,他们似乎无法修复它的结束,因此我尝试修复它.

Cam*_*oft 3

最后我选择使用PHP 中的Tidy库。我使用的代码如下所示:

  // Specify configuration
  $config = array(
    'input-xml'  => true,
    'show-warnings' => false,
    'numeric-entities' => true,
    'output-xml' => true);

  $tidy = new tidy();
  $tidy->parseFile('feed.xml', $config, 'latin1');
  $tidy->cleanRepair()
Run Code Online (Sandbox Code Playgroud)

这可以完美地纠正所有编码错误并将无效字符转换为 XML 实体。