PHP之token_get_all和token_name

两个函数,第一感觉让人莫名奇妙的函数。

首先,介绍 token_get_all()

作用: 将提供的源码按PHP标记进行分割,类似与其他字符串分割函数,只是该函数指定了分割模式,你只需要传入字符串就可以。

那么,最重要的就是所谓的PHP标记了。–参见文章的最后

注意:
1.必须是有效的PHP代码字符串才会被分解
2.额外的一个知识点,字符串的四种定界符:
(1) 双引号
(2) 单引号
(3) heredoc, <<<标识符 标识符; 相当于双引号,解析其中的变量
(4) nowdoc, <<<’标识符’ 标识符; 相当于单引号,不解析其中的变量

代码:

<?php

    $str=<<<'EOF'
<?php  
define('T_NEW_LINE', -1);function token_get_all_nl($source){
    $new_tokens = array();

    // Get the tokens
    $tokens = token_get_all($source);

    // Split newlines into their own tokens
    foreach ($tokens as $token)
    {
        $token_name = is_array($token) ? $token[0] : null;
        $token_data = is_array($token) ? $token[1] : $token;

        // Do not split encapsed strings or multiline comments
        if ($token_name == T_CONSTANT_ENCAPSED_STRING || substr($token_data, 0, 2) == '/*')
        {
            $new_tokens[] = array($token_name, $token_data);
            continue;
        }

        // Split the data up by newlines
        $split_data = preg_split('#(\r\n|\n)#', $token_data, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

        foreach ($split_data as $data)
        {
            if ($data == "\r\n" || $data == "\n")
            {
                // This is a new line token
                $new_tokens[] = array(T_NEW_LINE, $data);
            }
            else
            {
                // Add the token under the original token name
                $new_tokens[] = is_array($token) ? array($token_name, $data) : $data;
            }
        }
    }

    return $new_tokens;
}

function token_name_nl($token)
{
    if ($token === T_NEW_LINE)
    {
        return 'T_NEW_LINE';
    }

    return token_name($token);
}
?>
EOF;

    $resArr = token_get_all($str);

    print_r($resArr);

结果片段:


Array
(
    [0] => Array
        (
            [0] => 374
            [1] => <?php 
            [2] => 1
        )

    [1] => Array
        (
            [0] => 377
            [1] =>  

            [2] => 1
        )

    [2] => Array
        (
            [0] => 308
            [1] => define
            [2] => 2
        )

    [3] => (
    [4] => Array
        (
            [0] => 316
            [1] => 'T_NEW_LINE'
            [2] => 2
        )

    [5] => ,
    [6] => Array
        (
            [0] => 377
            [1] =>  
            [2] => 2
        )

通过结果可以看到,得到一个二维数组

$resArr[0][0] 数字代号,需要使用token_name转换为下面表格中的代号
比如:
token_name(308); // T_STRING

$resArr[0][1] 分割的片段

代号语法参考
T_ABSTRACTabstract抽象类(自 PHP 5.0.0 起可用)
T_AND_EQUAL&=赋值运算符
T_ARRAYarray()array(),数组语法
T_ARRAY_CAST(array)类型转换
T_ASasforeach
T_BAD_CHARACTER在 ASCII 32 之前除了 \t (0x09), \n (0x0a) 和 \r (0x0d) 以外的任何字符
T_BOOLEAN_AND&&逻辑运算符
T_BOOLEAN_OR|逻辑运算符
T_BOOL_CAST(bool) 或 (boolean) 类型转换
T_BREAKbreakbreak
T_CASEcaseswitch
T_CATCHcatch异常处理(自 PHP 5.0.0 起可用)
T_CHARACTER
T_CLASSclass类和对象
T_CLONEclone类和对象。仅用于 PHP 5。
T_CLOSE_TAG?> 或 %>
T_COMMENT// 或 #以及 PHP 5 下的 /* */ 注释
T_CONCAT_EQUAL.=赋值运算符
T_CONSTconst
T_CONSTANT_ENCAPSED_STRING“foo” 或 ‘bar’字符串语法
T_CONTINUEcontinue
T_CURLY_OPEN
T_DEC- -递增/递减运算符
T_DECLAREdeclaredeclare
T_DEFAULTdefaultswitch
T_DIV_EQUAL/=赋值运算符
T_DNUMBER0.12,等等 浮点数
T_DOC_COMMENT/** */PHPDoc 风格的注释(仅用于 PHP 5)
T_DOdodo..while
T_DOLLAR_OPEN_CURLY_BRACES${复杂变量解析语法
T_DOUBLE_ARROW=>数组语法
T_DOUBLE_CAST(real),(double),(float)类型转换
T_DOUBLE_COLON::见下面的 T_PAAMAYIM_NEKUDOTAYIM
T_ECHOechoecho
T_ELSEelseelse
T_ELSEIFelseifelseif
T_EMPTYemptyempty()
T_ENCAPSED_AND_WHITESPACE
T_ENDDECLAREenddeclaredeclare,替代语法
T_ENDFORendforfor,替代语法
T_ENDFOREACHendforeachforeach,替代语法
T_ENDIFendifif,替代语法
T_ENDSWITCHendswitchswitch,替代语法
T_ENDWHILEendwhilewhile,替代语法
T_END_HEREDOCheredoc语法
T_EVALeval()eval()
T_EXITexit 或 dieexit(), die()
T_EXTENDSextendsextends,类和对象
T_FILE__FILE__常量
T_FINALfinalFinal 关键字(自 PHP 5.0.0 起可用)
T_FORforfor
T_FOREACHforeachforeach
T_FUNCTIONfunction 或 cfunction函数
T_GLOBALglobal变量范围
T_HALT_COMPILER__halt_compiler()__halt_compiler(自 PHP 5.1.0 起可用)
T_IFifif
T_IMPLEMENTSimplements对象接口(自 PHP 5.0.0 起可用)
T_INC++递增/递减运算符
T_INCLUDEinclude()include
T_INCLUDE_ONCEinclude_once()include_once
T_INLINE_HTML
T_INSTANCEOFinstanceoftype operators(仅 PHP5)
T_INT_CAST(int) 或 (integer)类型转换
T_INTERFACEinterface对象接口(自 PHP 5.0.0 起可用)
T_ISSETisset()isset()
T_IS_EQUAL==比较运算符
T_IS_GREATER_OR_EQUAL>=比较运算符
T_IS_IDENTICAL===比较运算符
T_IS_NOT_EQUAL!= or <>比较运算符
T_IS_NOT_IDENTICAL!==比较运算符
T_IS_SMALLER_OR_EQUAL<=比较运算符
T_LINE__LINE__常量
T_LISTlist()list()
T_LNUMBER123,012,0x1ac,等等整型
T_LOGICAL_ANDand逻辑运算符
T_LOGICAL_ORor逻辑运算符
T_LOGICAL_XORxor逻辑运算符
T_MINUS_EQUAL-=赋值运算符
T_ML_COMMENT/* 和 */注释(仅用于 PHP 4)
T_MOD_EQUAL%=赋值运算符
T_MUL_EQUAL*=赋值运算符
T_NEW new 类和对象
T_NUM_STRING
T_OBJECT_CAST(object)类型转换
T_OBJECT_OPERATOR->类和对象
T_OPEN_TAG<?php, <? 或 <%从 HTML 转义
T_OPEN_TAG_WITH_ECHO<?= or <%=从 HTML 转义
T_OR_EQUAL=赋值运算符
T_PAAMAYIM_NEKUDOTAYIM::::也定义为 T_DOUBLE_COLON。
T_PLUS_EQUAL+=赋值运算符
T_PRINTprint()print
T_PRIVATEprivate类和对象。仅用于 PHP 5。
T_PUBLICpublic类和对象。仅用于 PHP 5。
T_PROTECTEDprotected类和对象。仅用于 PHP 5。
T_REQUIRErequire()require
T_REQUIRE_ONCErequire_once()require_once
T_RETURNreturn返回值
T_SL<<位运算符
T_SL_EQUAL<<=赋值运算符
T_SR>>位运算符
T_SR_EQUAL>>=赋值运算符
T_START_HEREDOC<<<heredoc 语法
T_STATICstatic变量范围
T_STRING
T_STRING_CAST(string)类型转换
T_STRING_VARNAME
T_SWITCHswitchswitch
T_THROWthrow异常处理(自 PHP 5.0.0 起可用)
T_TRYtry异常处理(自 PHP 5.0.0 起可用)
T_UNSETunset()unset()
T_UNSET_CAST(unset)(无文档; 类型为 NULL)
T_USEuse(未实现)
T_VARvar类和对象
T_VARIABLE$foo变量
T_WHILEwhilewhile,do..while
T_WHITESPACE
T_XOR_EQUAL^=赋值运算符
T_FUNC_C__FUNCTION__常量,自 PHP 4.3.0 起可用
T_CLASS_C__CLASS__常量,自 PHP 4.3.0 起可用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值