介绍
从以下对话
重新开始
为什么不简单地使用正则表达式?–
GionaF
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 clean and repair实用程序的绑定,它不仅允许您清理和以其他方式操作 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 是一个用 PHP 编写的符合标准的 HTML 过滤器库。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
如果你想要的只是 dom 而你不关心我的所有解释,那么你可以使用
$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()));