PHP Tidy удаляет пробелы и вставляет новые строки
Я хотел бы использовать 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;
}
Я попытался изменить несколько вариантов, но не удалось.
2 ответов
Я нашел решение, но оно немного хакерское, поэтому я все еще открыт для лучших предложений.
поставить <pre>
вокруг xml, который вы хотите проверить (это инструктирует Tidy не изменять пробелы), затем восстановите xml с помощью output-html, установленного в true, затем удалите <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, чтобы удалить несколько пустых строк и предотвратить добавление перерывов$html = preg_replace("/\n([\s]*)\n/", "\r\n", $html);