tidy扩展 原文链接https://blog.csdn.net/beyond__devil
>tidy,html美化与修复
2016年10月19日 07:45:45
阅读数:1192
tidy这个扩展还是有点用处的,网上的资料真的有点少,只有硬着头皮啃啃手册了:
适用场景:
1.js编辑器,发送给我们的html内容,可能有不闭合、错误等情况,可通过它来修复
2.提供的html页面结构混乱,可用它来美化
tidy库的配置文档:
http://tidy.sourceforge.net/docs/quickref.html
简介:
tidy,从单词上我们大概就可以看出来:整洁、整理的意思。tidy是一个绑定的HTML清洁和修复的工具,不仅仅允许我们清理,操作HTML文档,而且允许我们遍历文档树。
运行时配置:
tidy.default_config - 默认的tidy配置文件,默认是 ""
tidy.clean_output - 开启或关闭经tidy修复后输出,默认是 "0"
警告:
当生成一个非html格式的内容,例如:动态图片,不要开启 tidy.clean_output
预定义常量:
tidy的预定义常量相对较多,因为是针对HTML,所以包含了HTML的tag,attribute,nodetype。
每个 'TIDY_TAG_XXX' 代表一个html的tag,例如:TIDY_TAG_A 代表 ''。每个 'TIDY_ATTR_XXX' 代表一个html的attribute,例如:TIDY_ATTR_HREF 代表 'href' 属性。
实例:
tidy扩展,还是得多参考点实例,我就多看看手册上的例子了:
1.清洁一个html片段,确保所有的标签是闭合的,也不会添加html/head/body标签
[plain] view plain copy
$tidy_config = array(
'clean' => true,
'output-xhtml' => true,
'show-body-only' => true,
'wrap' => 0,
);
$tidy = tidy_parse_string($html_fragment, $tidy_config, 'UTF8');
$tidy->cleanRepair();
echo $tidy;
?>
2.简单清洁html片段(以一个有效的XHTML解析)
[plain] view plain copy
$tidy_config = array(
'clean' => true,
'drop-proprietary-attributes' => true,
'output-xhtml' => rue,
'show-body-only' => true,
'word-2000'=> true,
'wrap' => '0'
);
?>
3.如果你在寻找一个快速和肮脏的方式来输出你以特定方式创建HTML代码,可使用下面的技术,反正每次我都获取到了我想要的结果:
[plain] view plain copy
$html = 'a chunk of html you created';
$config = array(
'indent' => true,
'output-xml' => true,
'input-xml' => true,
'wrap' => '1000'
);
// Tidy
$tidy = new tidy();
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();
echo tidy_get_output($tidy);
?>
4.关于配置选项的重要提醒:
如果你看过 'dity' 的快速参考页面 'http://tidy.sourceforge.net/docs/quickref.html',你可能得到一个想法:boolean值的配置项,也可以被设置为 'y'|'yes'|'n'|'no',但是在php扩展中的tidy是无效的。必须设置为 true|false,且不能被 "|' 引起。被 '引起' 的配置tidy将会忽略你的配置,从而导致一个错误或警告。
5.基础的tidy使用方法,借助了 'ob输出控制扩展':
[plain] view plain copy
ob_start();
?>
a html document
$html = ob_get_clean();
// Specify configuration
$config = array(
'indent' => true,
'output-xhtml' => true,
'wrap' => 200);
// Tidy
$tidy = new tidy;
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();
// Output
echo $tidy;
?>
6.如果你正在寻找HTML美化工具(一个缩进HTMl(通过你脚本输出的html)的工具),tidy扩展可能不是针对这项工具正确的选择。
首先并且最重要的是,你不应该在生产代码中使用 'tidy' 或者其它可选的扩展(例如:HTML Purifier-html净化器)。HTML后处理是相对消耗资源的任务。尤其是基本的实现依赖DOM API。然而,除了性能,生产上的HTML美化可能隐藏了更多的、严重的输出问题,这些问题是难以追溯的,因为输出将不与输入匹配(这里的英文单词是:align)
如果你使用缩进,仅仅是为了开发时,展示一致的 ,可读的格式输出,你可以考虑通过正则表达式来实现,我已经在github上实现了这个意图(https://github.com/gajus/dindent)。tidy和我的这个实现的区别是:基于正则表达式的实现,不会尝试去 净化、验证或者操作你的输出,只是确保合适的缩进。
7.任意一个安装文档中尝试指定 'indent: auto' 的配置都不生效:
[plain] view plain copy
$tidy_options = array('indent' => 'auto'); // 不生效
$tidy_options = array('indent' => 2); // 设置为2,等同于 'indent: auto'
$tidy = new Tidy();
$tidy->parseString($html, $tidy_options);
?>
tidy类:
__construct([string $filename[, mixed $conf[, string $encoding[, bool $use_include_path]]]])
实例化一个tidy对象
1.$filename
如果传入了文件名,构造函数将读取文件,并使用文件来初始化对象,表现的同调用 'tidy_parse_file()' 一样。
2.$config
配置。可以传入数组或字符串。字符串表示的是 '配置文件路径',数组会被当作配置项
3.$encoding
设置html文档的输入/输出编码。可选的编码值有:ascii, latin0, latin1, raw, utf8, iso2022, mac, win1252, ibm858, utf16, utf16le, utf16be, big5, and shiftjis.
4.$use_include_path
在 'include_path' 配置中搜索文件名
5.实例:
[plain] view plain copy
$tidy = new tidy('index.html');
?>
parseFile([string $filename[, mixed $conf[, string $encoding[, bool $use_include_path]]]])
同 '__construct()',解析文件或URL的标记。
1.我们实例化时,可以不传入参数,在这里才传入参数
2.实例:
[plain] view plain copy
$tidy = new tidy();
$tidy->parseFile('index.html');
?>
parseString(string $input[, mixed $config[, string $encoding]])
解析的非文件,而是dom字符串(函数式编程调用:tidy_parse_string())
1.实例:
[plain] view plain copy
ob_start();
?>
test
error
another line
$buffer = ob_get_clean(); // ob扩展得到html字符串(以后我们也得这么使用,面得字符串赋值)
$config = array('indent' => TRUE,
'output-xhtml' => TRUE,
$tidy = new tidy();
$tidy->parseString($buffer, $config);
?>
cleanRepair()
上面解析了字符串或文件,调用此函数,来清洁和修复实例化的tidy对象。
1.实例:
[plain] view plain copy
$html = '
test'
$tidy = new tidy();
$tidy->parseString($html);
$tidy->cleanRepair();
echo $tidy; // 调用清洁和修复方法处理后,tidy对象返回的是一个字符串
?>
repairFile(string $filename[, mixed $conf[, string $encoding[, bool $use_include_path]]])
修复给定文件,并返回字符串
1.实例:
[plain] view plain copy
$file = 'file.html';
$tidy = new tidy();
$repaired = $tidy->repairfile($file);
rename($file, $file . '.bak');
file_put_contents($file, $repaired); // 保存修复后的字符串到'.bak'文件
?>
repaireString(string $data[, mixed $config[, string $encoding]]);
修复给定字符串,并返回字符串
1.实例:
[plain] view plain copy
ob_start();
?>
test
error
$buffer = ob_get_clean();
$tidy = new tidy();
$clean = $tidy->repairString($buffer); // 使用ob得到html字符串
echo $clean; // 输出修复后的字符串
?>
root()
返回tidy解析树 '根' 的 'tidyNode' 对象(类似文件系统的 '根目录')
html()
返回tidy解析树中的标签对应的 'tidyNode' 对象
body()
返回tidy解析树中的标签对应的 'tidyNode' 对象
head()
返回tidy解析树中的标签对应的 'tidyNode' 对象
isXml()
指出文档是否是一般的XML文档(非HTML/XHTML文档)
1.特别注意:
在TidyLib库中,还未实现此方法,所以总是返回 false
isXhtml()
指出文档是否是一个XHTML文档
1.特别注意:
在TidyLib库中,还未实现此方法,所以总是返回 false
getConfig()
获取当前实例化的tidy对象使用的配置列表(包括我们未定义的,默认的选项)
getOpt()
获取当前实例化的tidy对象使用的某个具体配置
getStatus()
获取指定tidy对象的状态
1.返回值
成功返回0,警告或访问权限错误返回1,其它错误返回2
getOptDoc()
获取某个具体配置的文档
getHtmlVer()
获取指定tidy对象的所解析的HTML版本
1.特别注意:
在TidyLib库中,还未实现此方法,所以总是返回 0
getRelease()
获取TidyLib库的发行日期(版本)
错误输出:
$errorBuffer - 是一个属性
解析文档时,返回可能发生的警告或错误,返回一个字符串
diagnose()
解析文档时,我们传入的 $config 配置中,有关于 'diagnose-诊断' 的配置,目的是:输出更详细的错误
实例:
[plain] view plain copy
$html = <<< HTML
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
paragraph
HTML;
$tidy = tidy_parse_string($html);
$tidy->cleanRepair();
// 普通的错误输出
echo $tidy->errorBuffer . "\n";
// 经过 diagnose() 后的错误输出
$tidy->diagnose();
echo $tidy->errorBuffer;
?>
tidyNode类:
属性:
value
节点的HTMl呈现,包含外表的标签(类似js的outerHTML)
name
节点名
type
标签类型(常量列表中查看,例如:TIDY_NODETYPE_PHP - php节点)
line
文件中标签所在的行号
column
文件中标签所在的列号
proprietary
节点是否是一个私有标签(例如:HTML中非标准标签)
id
标签的ID(常量列表中查看,例如:TIDY_TAG_FRAME,表示 '' 标签)
attribute
标签的属性数组,标签名为key,值为val
child
当前节点的所有子节点,是个数组,数组中每个元素都是一个 tidyNode 对象
方法:
getParent()
返回当前节点的父节点
1.返回值
存在父节点,返回tidyNode对象,否则返回NULL
hasChildren()
检查是否有子节点
1.返回true/false
hasSiblings()
检查是否有兄弟节点
1.返回true/false
isHtml()
检查节点是否是HTML文档的一部分
isText()
是否是普通文本节点
isComment()
是否是评论
isPhp()
是否是内嵌的php节点
isAsp()
是否是内嵌的asp节点
isJste()
是否是内嵌的js节点
tidy函数:
tidy2.0后,很多已经废弃,只有下面几个还可以:
ob_tidyhandler(string $input[, int $mode])
ob_start()的回调函数,用来修复buffer。
1.$input
缓冲区内容
2.$mode
缓冲区模式
3.返回值
返回修改后的buffer内容
4.实例:
[plain] view plain copy
ob_start('ob_tidyhandler'); // 注册进来
echo '
test';
?>
tidy_config_count(tidy $object)
指定的tidy对象的配置错误个数
tidy_access_count(tidy $object)
指定文档的可访问警告个数
tidy_warning_count(tidy $object)
指定文档的tidy警告个数
tidy_error_count(tidy $object)
指定文档的tidy错误个数
tidy_get_output(tidy $object)
返回清洁,修复后的html字符串
1.实例:
[plain] view plain copy
$html = '
paragraph';
$tidy = tidy_parse_string($html);
$tidy->cleanRepair();
echo tidy_get_output($tidy); // 方式1
echo $tidy; // 方式2,之前手册的实例有这种输出方式
echo $tidy->html()->value; // 方式3,先获取到html标签对象,输出它的值(js中的outerHTML)
echo $tidy->value; // 方式4
?>