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, чтобы удалить несколько пустых строк и предотвратить добавление разрывов Tidy $html = preg_replace("/\n([\s]*)\n/", "\r\n", $html);

Другие вопросы по тегам