两个函数,第一感觉让人莫名奇妙的函数。
首先,介绍 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_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 | <?php, <? 或 <% | 从 HTML 转义 |
T_OPEN_TAG_WITH_ECHO | <?= or <%= | 从 HTML 转义 |
T_OR_EQUAL | = | 赋值运算符 |
T_PAAMAYIM_NEKUDOTAYIM | :: | ::也定义为 T_DOUBLE_COLON。 |
T_PLUS_EQUAL | += | 赋值运算符 |
T_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 起可用 |