我正在尝试使用PHP中的PCRE库编写正则表达式.
我需要一个正则表达式匹配&
,>
以及<
任何XML节点的字符串部分中存在的字符,而不是标签声明本身.
输入XML:
<pnode>
<cnode>This string contains > and < and & chars.</cnode>
</pnode>
Run Code Online (Sandbox Code Playgroud)
我们的想法是搜索并替换这些字符并将它们转换为XML实体等价物.
如果我要将整个XML转换为实体,那么XML将如下所示:
整个XML转换为实体
<pnode>
<cnode>This string contains > and < and & chars.</cnode>
</pnode>
Run Code Online (Sandbox Code Playgroud)
我需要它看起来像这样:
正确的XML
<pnode>
<cnode>This string contains > and < and & chars.</cnode>
</pnode>
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用look-ahaead编写一个正则表达式来匹配这些字符,但我不知道如何使它工作.我的尝试(目前只尝试匹配>符号):
/>(?=[^<]*<)/g
Run Code Online (Sandbox Code Playgroud)
只是为了说清楚我试图解决的XML来自第三方,他们似乎无法修复它的结束,因此我尝试修复它.
最后我选择使用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 实体。