PHP Tidy去除空格并插入新行

8

我想使用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>актион

它移除了</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;
    }

我尝试了几个选项,但没有成功。


http://tidy.sourceforge.net/docs/quickref.html#output-xml - hakre
PHP Simple HTML DOM解析器比大多数解析器更宽松。http://simplehtmldom.sourceforge.net/ - Petah
@hakre 我删除了除'input-xml' => true之外的所有设置(因为否则它会输出完整的HTML文档)。然而,这并没有帮助。我还尝试设置'output-xml' => false,但这也没有帮助。有什么办法可以防止剥离/修剪和格式化吗? - hansmbakker
我在https://dev59.com/rVHTa4cB1Zd3GeqPR3yZ上找到了这个问题,但是对我来说似乎很奇怪,无法关闭格式化(换行和修剪)。 - hansmbakker
@Petah 看起来更偏向于 HTML。我试过了,但它无法修复我输入的损坏的 XML。例如 <context><abbr>geog.</abbr> 应该被修复为 <context><abr>geog.</abr></context> 以使标签平衡。 - hansmbakker
2个回答

5
我找到了一个解决方法,但它有些“hackish”,所以我仍然希望有更好的建议。
将您想要验证的xml放在<pre>标签中(这将告诉Tidy不要更改空格),然后使用设置为true的output-html修复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>"));

1
在我的情况下,我能够运行一个替换操作来移除html中的多个空行并防止Tidy添加断行符。 $html = preg_replace("/\n([\s]*)\n/", "\r\n", $html);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接