我想使用PHP Tidy来确保我的xml在我加载到DomDocument之前是有效的。
然而,我不希望Tidy改变我的格式-我只希望它修复不平衡标签等问题。
这个问题的一个例子可以在这个页面看到:http://www.tek-tips.com/viewthread.cfm?qid=1654452
我自己的例子如下。
输入:<ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex>
(已经是有效的xml)
期望输出:<ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex>
(</context>
和актион
之间有断行空格)
实际输出:
<ex>
<context>собр
<stress>а</stress>ние</context>акцион
<stress>е</stress>ров —
<stress>aa</stress>ndeelhoudersvergadering</ex>
(它删除了</context>
和актион
之间的空格,这将使文本不可读,并在每个标签后插入换行符)
function TidyXml($inputXml)
{
$config = array(
'indent' => false,
'output-xml' => true,
'input-xml' => true,
);
$tidy = new tidy();
$tidy->parseString($inputXml, $config, 'utf8');
$tidy->cleanRepair();
$cleanXml = tidy_get_output($tidy);
return $cleanXml;
}
我尝试了几个选项,但都没有成功。
我找到了一个解决方案,但有点粗糙,所以我仍然愿意接受更好的建议。
将<pre>
放在要验证的xml周围(这指示Tidy不更改空白),然后将output-html设置为true修复xml,然后删除<pre>
和'n
换行符。
的例子:
$config = array(
'indent' => false,
'indent-attributes' => false,
'output-html' => true,
'input-xml' => true,
'wrap' => 0,
'vertical-space' => false,
'new-inline-tags' => 'context,abr,stress',
'new-blocklevel-tags' => 'def,ex,examples'
);
$tidy = new tidy();
$inputXml = "<pre>" . $inputXml . "</pre>";
$validXml = $tidy->repairString($inputXml, $config, 'utf8');
$cleanXml = str_replace("'n", "", $validXml);
$cleanXml = substr($cleanXml, strlen("<pre>"), strlen($cleanXml));
$cleanXml = substr($cleanXml, 0, strlen($cleanXml)-strlen("</pre>"));
在我的例子中,我能够在html上运行替换以删除多个空行并防止Tidy添加break $html = preg_replace("/'n(['s]*)'n/", "'r'n", $html);