(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
token_get_all — Разбивает исходный код на PHP-лексемы
Функция token_get_all() разбирает строку code
на токены языка PHP через лексический сканер Zend Engine.
Список токенов синтаксического анализатора приводит раздел «Список токенов парсера», или значения лексем в строковое представление переводят функцией token_name().
code
Исходный PHP-код, который требуется разбрать.
flags
Параметр принимает следующие флаги:
TOKEN_PARSE
- Распознает в отдельных контекстах,
возможно ли использовать зарезервированные слова.
Функция возвращает массив идентификаторов лексем. Каждый индивидуальный идентификатор токена —
или одиночный символ наподобие ;
, .
,
>
, !
и другие,
или 3-элементный массив, который содержит индекс лексемы в нулевом элементе, строку
с оригинальным содержимым токена в первом элементе и номером строки во втором элементе.
Пример #1 Пример разбивки исходного PHP-кода на токены функцией token_get_all()
<?php
$tokens = token_get_all('<?php echo; ?>');
foreach ($tokens as $token) {
if (is_array($token)) {
echo "Строка {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
}
}
?>
Вывод приведённого примера будет похож на:
Строка 1: T_OPEN_TAG ('<?php ') Строка 1: T_ECHO ('echo') Строка 1: T_WHITESPACE (' ') Строка 1: T_CLOSE_TAG ('?>')
Пример #2 Пример неправильной разбивки кода функцией token_get_all()
<?php
$tokens = token_get_all('/* комментарий */');
foreach ($tokens as $token) {
if (is_array($token)) {
echo "Строка {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;
}
}
?>
Вывод приведённого примера будет похож на:
Строка 1: T_INLINE_HTML ('/* комментарий */')
T_INLINE_HTML
вместо ожидаемого T_COMMENT
.
Это связано с тем, что в коде, который проверяет функция, не указали открывающий тег.
Это было бы эквивалентно помещению комментариев вне PHP-тегов в обычном файле.
Пример #3 Пример разбивки функцией token_get_all() кода класса, который содержит зарезервированные слова
<?php
$source = <<<'code'
<?php
class A
{
const PUBLIC = 1;
}
code;
$tokens = token_get_all($source, TOKEN_PARSE);
foreach ($tokens as $token) {
if (is_array($token)) {
echo token_name($token[0]) , PHP_EOL;
}
}
?>
Вывод приведённого примера будет похож на:
T_OPEN_TAG T_WHITESPACE T_CLASS T_WHITESPACE T_STRING T_CONST T_WHITESPACE T_STRING T_LNUMBER
TOKEN_PARSE
вместо предпоследнего токена
T_STRING
функция вернула бы токен T_PUBLIC
.