PHP - Tokenizer的学习经验分享

在某个项目中需要分析 PHP 代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑,这都不是最优的方式。

在某个项目中需要分析 PHP 代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑,这都不是最优的方式。

查询了 PHP 手册,发现其实 PHP 已经内置解析器的接口,那就是 PHP Tokenizer,这工具正是我想要的。使用 PHP Tokenizer 能简单、高效、准确的分析出 PHP 源代码的组成。

实例

官方站点对 Tokenizer 的文档很少,不过这不影响我们理解它。Tokenizer 组件仅仅包含两个函数:token_get_all 以及 token_name,它们分别用于分析 PHP 代码以及获取代码对应的标识符名称。

下面是个简单的实例,说明如何使用这两个函数:

以下为引用的内容:

$code = '<?php echo "string1"."string2"; ?>';
$tokens = token_get_all($code);
foreach ($tokens as $token) {
    if (is_array($token)) {
        // 行号、标识符字面量、对应内容
        printf("%d - %s\t%s\n", $token[2], token_name($token[0]), $token[1]);
    }
}

对应的输出为

以下为引用的内容:

1 - T_OPEN_TAG    <?php
1 - T_ECHO    echo
1 - T_WHITESPACE    
1 - T_CONSTANT_ENCAPSED_STRING    "string1"
1 - T_CONSTANT_ENCAPSED_STRING    "string2"
1 - T_WHITESPACE    
1 - T_CLOSE_TAG    ?>

这里顺便说明下,$token 如果为数组,那么分别对应的三个数组成员为 token 标识符(可以用 token_name 获得字面量)、对应的源代码内容、以及对应的行号。

还有中情况就是 $token 为字符串,这可能的情况之一就是为 T_CONSTANT_ENCAPSED_STRING 等常量,在分析代码时要注意。如果对这点很在意,可以考虑使用这里的代码。

是的,调用方式非常的简单,我们的野心当然远远要比写个简单的循环要大得多。我们可以利用这个组件做写实事,例如下面的代码用于“压缩” PHP 代码,去除不不要的换行、空白以及注释

以下为引用的内容:

/**
 * “压缩”PHP 源代码
 *
 * @see http://c7y.phparch.com/c/entry/1/art,practical_uses_tokenizer
 */
class CompactCode
{
    static protected $out;
    static protected $tokens;

    static public function compact($source)
    {
        // 解析 PHP 源代码
        self::$tokens = token_get_all($source);  
        self::$out = '';

        reset(self::$tokens);

        // 递归判断每个标记符的类型
        while ($t = current(self::$tokens)) {
            if (is_array($t)) {
                // 过滤空白、注释
                if ($t[0] == T_WHITESPACE $t[0] == T_DOC_COMMENT $t[0] == T_COMMENT) {
                    self::skipWhiteAndComments();
                    continue;
                }      
                self::$out .= $t[1];
            } else {
                self::$out .= $t;
            }

            next(self::$tokens);
        }

        return self::$out;
    }

    static private function skipWhiteAndComments()
    {
        // 增加个空格,用于分割关键字
        self::$out .= ' ';
        while ($t = current(self::$tokens)) {
            // 再次贪婪查找
            if (is_array($t) && ($t[0] == T_WHITESPACE $t[0] == T_DOC_COMMENT $t[0] == T_COMMENT)) {
                next(self::$tokens);
            } else {
                return;
            }
        }
    }
}

调用方式很简单,只需要使用

以下为引用的内容:

CompactCode::compact($source_code);
 

即可,返回的字符串就是压缩以后的内容。
 

时间: 2024-09-11 22:12:08

PHP - Tokenizer的学习经验分享的相关文章

asp.net mvc-ASP.NET MVC4 学习经验分享,和交流。

问题描述 ASP.NET MVC4 学习经验分享,和交流. 求-学习ASP.NET MVC4的学习资料.包含ajax,linq.完整的项目也行! 解决方案 google 蒋金楠 重典,这两个人的blog非常值得你学习. 蒋金楠编写的asp.net mvc4 框架揭秘完全都是干货. 国外方面,微软自己的员工scott hanselman的blog值得你每天关注. 解决方案二: 学习linq推荐微软网站上的linq 101 samples,以及C# in depths这本书,网上有电子版,自己goo

手机APP设计师经验分享:APP用户体验设计

文章描述:实用的经验分享:如何让APP变快! ​做了设计转眼间也4年多了,从2011年由网页设计师转到手机APP设计师:最近的工作不是很忙,就静下心来去阅读学习下互联网的一些发展趋势来弥补自己在这方面的不足(因为工作的时间大部份都是做设计):之前一直以为用户体验方面的工作是有专门的研究人员去做的,与设计人员没有关系,通过这几天的学习,发现做设计的也可以做到用户体验啊,下面我就给大家一一介绍下,大家互相学习 ^_^ 一.后台的执行 核心思想:通过在状态栏运行加载的程序的同时,可以使用户可以做其他的

资深web开发程序员建站经验分享

web|web开发|建站|经验分享|程序员 我的历程:C - C++ - HTML - ASP - ASP.NET -JSP - PHP - XHTML(DIV+CSS) - 美工 设计工具:...(非web语言的不算了) - DreamWeaver + Editplus + Eclipse(JSP的时候) + ZEND(PHP时代) + PS(美工设计时代) 不知道有没有人和我类似现在做网站策划规划比较多点,主要在网站设计方面,讲究简为美的观点.现在写代码直接用EDITPLUS了,包括页面和C

我在外链建设中的几点方法和经验分享

众所周知外链的重要性,外链的权重和质量决定了网站关键词的排名,我也不多废话了,现在就和大家分享一下我在外链建设中的几个方法: 1.就拿我的QQ站来说吧,最近一周我分析了大约的50个QQ站的外链,每个都仔细的研究和分析了一下,这些网站外链有一点是雷同的就是问问SOSO,可想而知问答平台在外链建设中,有着很重要的作用,以前的话问问SOSO外链还是比较好发的,最近我发现他的审核机制好像是变的更严格了,好多站都进了黑名单,我的不幸也列入其中,好了不罗嗦了,在问答平台外链建设中应该注意回答问题的相关性,这

PS超强合成电商促销海报经验分享

  下面为大家分心PS超强合成电商促销海报经验,作者是尒白白,这篇教程很实用,作者把自己的经验都分享过来,对于没有接触过海报或是刚刚接触过海报的新人很值得学习,好了,下面我们一起来学习吧! 前言: 其实这次的分享也是想了很久的,因为本人自认为能力方面还不够,怕分享一些经验出来又误导了一些新人,但又有很多小伙伴们经常问我,是怎么做的了,怎么合成的,有什么思路吗? 所以这次斗胆分享一些经验,希望对一些新人有朋友,自己能力有限,自知画面中还有很多的不足,希望各位大神们,有哪些不足的地方能指出来,感谢!

专注改版经验分享的酷站REDSGN.CO

  终于找到这种网站了!Redsgn.co是一个专注分享网站改版 心得/经验等的网站,通过改版前后的设计对比,帮你学习如何让产品更优秀.里面不乏大型项目(Apple Music.BBC.Yahoo!等)的改版经验分享 ,我们精选了几个优秀案例,一起来看下! Redsgn.co ReDsgn.Co 目前有Android.Apple以及热门的改版项目,点击每个都会有一些设计心得,对于设计师来说,闲时都可以看看,因为有很多都是比较著名或者大型的项目,有一定能考价值. 精选一些优秀的项目: APPLE

2017“CCF科学技术奖”全公布,6位获奖人带来独家经验分享

本文讲的是2017"CCF科学技术奖"全公布,6位获奖人带来独家经验分享, 由中国计算机学会(CCF)主办,福州市人民政府.福州大学承办,福建师范大学.福建工程学院协办的2017中国计算机大会(CNCC2017)将于10.26-10.28日在福州·海峡国际会展中心举办.今年大会的主题是"人工智能改变世界(AI Changes the World)",届时将邀请十多位院士.300余位国内外计算机领域知名专家.著名国际国内IT企业家到会演讲. 会议包括14个特邀报告.2

新浪微博千万级规模高性能、高并发的网络架构经验分享

[本文转载自新浪微博千万级规模高性能.高并发的网络架构经验分享] 架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上要重视它,战术上又要藐视它. 先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右.对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写

千万级规模高性能、高并发的网络架构经验分享

千万级规模高性能.高并发的网络架构经验分享 主 题 :INTO100沙龙时间 :2015年11月21日下午地点 :梦想加联合办公空间分享人:卫向军(毕业于北京邮电大学,现任微博平台架构师,先后在微软.金山云.新浪微博从事技术研发工作,专注于系统架构设计.音视频通讯系统.分布式文件系统和数据挖掘等领域.) 架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又 要 藐