Введение
Из следующих разговоров
требовать
Почему бы вам просто не использовать регулярные выражения? –
ГионаФ
rekire я давно так делаю, но пытаюсь перейти на DOMDocument/html5lib... codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html`
Я полностью согласен, поэтому я считаю, что это не работа как для DomDocument
, так и для Regular Expresstion
, потому что вы имеете дело с проблемами depreciated HTML Tags
, которые больше не поддерживаются в HTML 5.
Значение
Это означает, что font
— не единственная проблема, которую вам, возможно, придется заменить.
- акроним
- апплет
- базовый шрифт
- большой
- центр
- директор
- Рамка
- набор фреймов
- без фреймов
- s
- забастовка
- tt
- xmp
Используйте аккуратный
Я бы порекомендовал Tidy, который был разработан таким образом, чтобы у вас не было делать то, что ты собираешься сделать
ФОРМА PHP-ДОКУМЕНТА
Tidy — это привязка к утилите Tidy HTML для очистки и восстановления, которая позволяет не только очищать HTML-документы и иным образом манипулировать ими, но также перемещаться по дереву документа. сильный>.
Пример
$html = '<font color="#ff0000">Lorem <font size="4">ipsum dolor</font> sit amet</font>';
$config = array(
'indent' => true,
'show-body-only' => false,
'clean' => true,
'output-xhtml' => true,
'preserve-entities' => true);
$tidy = new tidy();
echo $tidy->repairString($html, $config, 'UTF8');
Вывод
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style type="text/css">
/*<![CDATA[*/
span.c2 {
color: #FF0000
}
span.c1 {
font-size: 120%
}
/*]]>*/
</style>
</head>
<body><span class="c2">Lorem <span class="c1">ipsum dolor</span> sit amet</span>
</body>
</html>
См. также раздел Очистка HTML путем удаления лишних/избыточных тегов форматирования. для примеров
Лучший вариант: HTMLPurifier
Вы можете использовать HTMLPurifier, который также использует Tidy для очистки HTML. установить TidyLevel
HTML Purifier — это библиотека фильтров HTML, соответствующая стандартам, написанная на PHP. HTML Purifier не только удалит весь вредоносный код (более известный как XSS) с помощью тщательно проверенного, безопасного, но разрешительного белого списка, но и обеспечит соответствие ваших документов стандартам, что-то достижимое только при всестороннем знании спецификаций W3C
require_once 'htmlpurifier-4.4.0/library/HTMLPurifier.auto.php';
$html = '<font color="#ff0000">Lorem <font size="4">ipsum dolor</font> sit amet</font>';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.TidyLevel', 'heavy');
$purifier = new HTMLPurifier($config);
$clean = $purifier->purify($html);
var_dump($clean);
Вывод
string '<span style="color:#ff0000;">Lorem <span style="font-size:large;">ipsum dolor</span> sit amet</span>' (length=100)
Я хочу DOMDocument
Если все, что вам нужно, это дом, и вам все равно на все мои объяснения, вы можете использовать
$html = '<font color="#ff0000">Lorem <font size="4">ipsum dolor</font> sit amet</font>';
$dom = new DOMDocument();
$dom->loadHTML($html);
$nodes = iterator_to_array($dom->getElementsByTagName('font'));
foreach ( $nodes as $font ) {
$css = array();
$font->hasAttribute('size') and $css[] = 'font-size:' . round($font->getAttribute('size') / 2, 1) . 'em;';
$font->hasAttribute('color') and $css[] = 'color:' . $font->getAttribute('color') . ';';
$span = $dom->createElement('span');
$children = array();
foreach ( $font->childNodes as $child )
$children[] = $child;
foreach ( $children as $child )
$span->appendChild($child);
$span->setAttribute('style', implode('; ', $css));
$font->parentNode->replaceChild($span, $font);
}
echo "<pre>";
$dom->formatOutput = true;
print(htmlentities($dom->saveXML()));
person
Baba
schedule
08.11.2012