php处理html

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  

?>  

你可能感兴趣的:(php处理html)