Я пытаюсь заменить все теги тегами, используя DOMDocument в PHP, и почти все мои тесты пройдены.Я уверен, что есть другие сценарии, которые я забыл, но сейчас я пропускаю только один:
ОРИГИНАЛ:
<p><font color="#ff0000">BEFORE <font color="#00ff00">BEFORE <font color="#0000ff">VAL</font> AFTER</font> AFTER</font></p>
РЕЗУЛЬТАТ:
<p><span style="color: #ff0000">BEFORE BEFORE VAL AFTER AFTER</span></p>
Код PHP для этого:
$html = '<p><font color="#ff0000">BEFORE <font color="#00ff00">BEFORE <font color="#0000ff">VAL</font> AFTER</font> AFTER</font></p>';
$dom = new DOMDocument();
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('font') as $node) {
$font_nodes[] = $node;
}
//$font_nodes = array_reverse($font_nodes);
foreach($font_nodes as $font) {
$a_style = array_filter(explode(';', $font->getAttribute('style')));
if($a_color = $font->getAttribute('color')) {
$a_style[] = 'color: '.$a_color;
}
$span = $dom->createElement('span', $font->nodeValue);
$span->setAttribute('style', implode('; ', $a_style));
$font->parentNode->replaceChild($span, $font);
}
echo preg_replace("#(<!DOCTYPE.+|<\/?html>|<\/?body>)#", '', $dom->saveHTML());
Я думал, что getElementsByTagName
был виновником, поскольку он загружал узлы по порядку, поэтому я попыталсяначинать с самого глубокого тега путем обращения массива, но это не сработало, поэтому строка закомментирована.
PS: Если вам интересно, зачем нужен первый цикл, чтобы сохранить все узлы и циклих снова, пожалуйста, прочитайте это: http://robrosenbaum.com/php/domnodelist-gotchas/