PHP之token_get_all和token_name

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

首先,介绍 token_get_all()

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

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

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

代码:

$str=<<<'EOF'
'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] =>  
            [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_ABSTRACT abstract 抽象类(自 PHP 5.0.0 起可用)
T_AND_EQUAL &= 赋值运算符
T_ARRAY array() array(),数组语法
T_ARRAY_CAST (array)类型转换
T_AS as foreach
T_BAD_CHARACTER 在 ASCII 32 之前除了 \t (0x09), \n (0x0a) 和 \r (0x0d) 以外的任何字符
T_BOOLEAN_AND && 逻辑运算符
T_BOOLEAN_OR | 逻辑运算符
T_BOOL_CAST (bool) 或 (boolean) 类型转换
T_BREAK break break
T_CASE case switch
T_CATCH catch 异常处理(自 PHP 5.0.0 起可用)
T_CHARACTER
T_CLASS class 类和对象
T_CLONE clone 类和对象。仅用于 PHP 5。
T_CLOSE_TAG ?> 或 %>
T_COMMENT // 或 # 以及 PHP 5 下的 /* */ 注释
T_CONCAT_EQUAL .= 赋值运算符
T_CONST const
T_CONSTANT_ENCAPSED_STRING “foo” 或 ‘bar’字符串语法
T_CONTINUE continue
T_CURLY_OPEN
T_DEC - - 递增/递减运算符
T_DECLARE declare declare
T_DEFAULT default switch
T_DIV_EQUAL /= 赋值运算符
T_DNUMBER 0.12,等等 浮点数
T_DOC_COMMENT /** */ PHPDoc 风格的注释(仅用于 PHP 5)
T_DO do do..while
T_DOLLAR_OPEN_CURLY_BRACES ${ 复杂变量解析语法
T_DOUBLE_ARROW => 数组语法
T_DOUBLE_CAST (real),(double),(float) 类型转换
T_DOUBLE_COLON :: 见下面的 T_PAAMAYIM_NEKUDOTAYIM
T_ECHO echo echo
T_ELSE else else
T_ELSEIF elseif elseif
T_EMPTY empty empty()
T_ENCAPSED_AND_WHITESPACE
T_ENDDECLARE enddeclare declare,替代语法
T_ENDFOR endfor for,替代语法
T_ENDFOREACH endforeach foreach,替代语法
T_ENDIF endif if,替代语法
T_ENDSWITCH endswitch switch,替代语法
T_ENDWHILE endwhile while,替代语法
T_END_HEREDOC heredoc 语法
T_EVAL eval() eval()
T_EXIT exit 或 die exit(), die()
T_EXTENDS extends extends,类和对象
T_FILE __FILE__ 常量
T_FINAL final Final 关键字(自 PHP 5.0.0 起可用)
T_FOR for for
T_FOREACH foreach foreach
T_FUNCTION function 或 cfunction 函数
T_GLOBAL global 变量范围
T_HALT_COMPILER __halt_compiler() __halt_compiler(自 PHP 5.1.0 起可用)
T_IF if if
T_IMPLEMENTS implements 对象接口(自 PHP 5.0.0 起可用)
T_INC ++ 递增/递减运算符
T_INCLUDE include() include
T_INCLUDE_ONCE include_once() include_once
T_INLINE_HTML
T_INSTANCEOF instanceof type operators(仅 PHP5)
T_INT_CAST (int) 或 (integer) 类型转换
T_INTERFACE interface 对象接口(自 PHP 5.0.0 起可用)
T_ISSET isset() 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_LIST list() list()
T_LNUMBER 123,012,0x1ac,等等 整型
T_LOGICAL_AND and 逻辑运算符
T_LOGICAL_OR or 逻辑运算符
T_LOGICAL_XOR xor 逻辑运算符
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 从 HTML 转义
T_OPEN_TAG_WITH_ECHO 从 HTML 转义
T_OR_EQUAL = 赋值运算符
T_PAAMAYIM_NEKUDOTAYIM :: ::也定义为 T_DOUBLE_COLON。
T_PLUS_EQUAL += 赋值运算符
T_PRINT print() print
T_PRIVATE private 类和对象。仅用于 PHP 5。
T_PUBLIC public 类和对象。仅用于 PHP 5。
T_PROTECTED protected 类和对象。仅用于 PHP 5。
T_REQUIRE require() require
T_REQUIRE_ONCE require_once() require_once
T_RETURN return 返回值
T_SL << 位运算符
T_SL_EQUAL <<= 赋值运算符
T_SR >> 位运算符
T_SR_EQUAL >>= 赋值运算符
T_START_HEREDOC <<< heredoc 语法
T_STATIC static 变量范围
T_STRING
T_STRING_CAST (string) 类型转换
T_STRING_VARNAME
T_SWITCH switch switch
T_THROW throw 异常处理(自 PHP 5.0.0 起可用)
T_TRY try 异常处理(自 PHP 5.0.0 起可用)
T_UNSET unset() unset()
T_UNSET_CAST (unset) (无文档; 类型为 NULL)
T_USE use (未实现)
T_VAR var 类和对象
T_VARIABLE $foo 变量
T_WHILE while while,do..while
T_WHITESPACE
T_XOR_EQUAL ^= 赋值运算符
T_FUNC_C __FUNCTION__ 常量,自 PHP 4.3.0 起可用
T_CLASS_C __CLASS__ 常量,自 PHP 4.3.0 起可用

你可能感兴趣的:(php)