2015-09-04 3 views
1

У меня есть этот результат (с $ dom-> saveHTML()):Как сохранить HTML с отступом атрибутов?

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Complete!</title> 
    </head> 
    <body> 
     <div id="foo" class="bar baz" data-foo="a" data-bar="b" data-baz="c"></div> 
    </body> 
</html> 

Но я хочу сохранить результат с отступом атрибутов:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Complete!</title> 
    </head> 
    <body> 
     <div id="foo" 
       class="bar baz" 
       data-foo="a" 
       data-bar="b" 
       data-baz="c"></div> 
    </body> 
</html> 

Как сделать это с родной PHP (?) DOMDocument/DOMNode/DOMElement/somethingelse?

UPD: Да! Мне действительно нужно это конкретное форматирование для чтения человеком.

+1

Я не думаю, что вы можете это сделать. Кроме того: почему вы действительно отказались от этого конкретного форматирования? –

+0

@EliasVanOotegem, да, действительно требуется. У libxml2 (язык C) есть эта функция (вероятно). Но здесь нужна реализация php. – Deep

+0

@EliasVanOotegem например (Ctrl + U): https://cdn.css-tricks.com/wp-content/uploads/2015/05/kiwi.svg – Deep

ответ

0

Сам ответил. Возможно, это будет хорошее решение:

$html = $dom->saveHTML(); 
$html = html_entity_decode($html, ENT_QUOTES, 'UTF-8'); 
$html = explode("\n", $html); 
foreach ($html as $num => $line) { 
    if (preg_match('/^(\s*<[a-z]+\s+)([^>]+)(>)(.*)$/s', $line, $m)) { 
     $offset = ceil(mb_strlen($m[1])/4); 
     $attrs = preg_split('/"\s+/', $m[2]); 
     $attrs = join("\"\n" . str_repeat(' ', $offset), $attrs); 
     $html[$num] = $m[1] . $attrs . $m[3] . $m[4]; 
    } 
} 
$html = join("\n", $html);