其它基本扩展->tidy,html美化与修复

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 代表 '<a>'。每个 'TIDY_ATTR_XXX' 代表一个html的attribute,例如:TIDY_ATTR_HREF 代表 'href' 属性。

实例:

    tidy扩展,还是得多参考点实例,我就多看看手册上的例子了:
    1.清洁一个html片段,确保所有的标签是闭合的,也不会添加html/head/body标签
        <?php 
            $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解析)
        <?php 
            $tidy_config = array( 
                'clean' => true, 
                'drop-proprietary-attributes' => true, 
                'output-xhtml' => rue, 
                'show-body-only' => true, 
                'word-2000'=> true, 
                'wrap' => '0' 
            ); 
        ?>

    3.如果你在寻找一个快速和肮脏的方式来输出你以特定方式创建HTML代码,可使用下面的技术,反正每次我都获取到了我想要的结果:
        <?php
            $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输出控制扩展':
        <?php
        ob_start();
        ?>
        <html>a html document</html>
        <?php
        $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' 的配置都不生效:
        <?php
            $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.实例:
            <?php
                $tidy = new tidy('index.html');
            ?>

    parseFile([string $filename[, mixed $conf[, string $encoding[, bool $use_include_path]]]])
        同 '__construct()',解析文件或URL的标记。
        1.我们实例化时,可以不传入参数,在这里才传入参数 
        2.实例:
            <?php
                $tidy = new tidy();
                $tidy->parseFile('index.html');
            ?>

    parseString(string $input[, mixed $config[, string $encoding]])
        解析的非文件,而是dom字符串(函数式编程调用:tidy_parse_string())
        1.实例:
            <?php
            ob_start();
            ?>

            <html>
              <head>
               <title>test</title>
              </head>
              <body>
               <p>error<br>another line</i>
              </body>
            </html>

            <?php
            $buffer = ob_get_clean();   // ob扩展得到html字符串(以后我们也得这么使用,面得字符串赋值)
            $config = array('indent' => TRUE,
                            'output-xhtml' => TRUE,
            $tidy = new tidy();
            $tidy->parseString($buffer, $config);
            ?>

    cleanRepair()
        上面解析了字符串或文件,调用此函数,来清洁和修复实例化的tidy对象。
        1.实例:
            <?php
                $html = '<p>test</I>'
                $tidy = new tidy();
                $tidy->parseString($html);
                $tidy->cleanRepair();
                echo $tidy;     // 调用清洁和修复方法处理后,tidy对象返回的是一个字符串
            ?>

    repairFile(string $filename[, mixed $conf[, string $encoding[, bool $use_include_path]]])
        修复给定文件,并返回字符串
        1.实例:
            <?php
            $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.实例:
            <?php
            ob_start();
            ?>

            <html>
              <head>
                <title>test</title>
              </head>
              <body>
                <p>error</i>
              </body>
            </html>

            <?php
            $buffer = ob_get_clean();
            $tidy = new tidy();
            $clean = $tidy->repairString($buffer);  // 使用ob得到html字符串
            echo $clean;    // 输出修复后的字符串
            ?>

    root()
        返回tidy解析树 '根' 的 'tidyNode' 对象(类似文件系统的 '根目录')
    html()
        返回tidy解析树中的<html>标签对应的 'tidyNode' 对象
    body()
        返回tidy解析树中的<body>标签对应的 'tidyNode' 对象
    head()
        返回tidy解析树中的<head>标签对应的 '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-诊断' 的配置,目的是:输出更详细的错误
    实例:
        <?php
            $html = <<< HTML
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <p>paragraph</p>
            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,表示 '<frame></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.实例:
            <?php
                ob_start('ob_tidyhandler');     // 注册进来
                echo '<p>test</i>';
            ?>

    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.实例:
        <?php
            $html = '<p>paragraph</i>';
            $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
        ?>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值