token_get_all Поведение пробелов - PullRequest
1 голос
/ 28 января 2010

Не знаю, может ли кто-нибудь мне помочь, но я все равно спрошу. Я создаю функцию, подобную php token_get_all, написанную на javascript. Эта функция должна "токенизировать" данный php-код, но у меня есть некоторые проблемы с пробелами.

Выполнение функции token_get_all в php. Я вижу, что только некоторые пробелы считаются токенами, остальные игнорируются.

Может кто-нибудь объяснить мне, как эта функция ведет себя с пробелами? Вы когда-нибудь находили документацию по этому поводу?

UPDATE

<?php
if ($var == 0)
{
?>
  • Между php и if: игнорируется
  • Между if и (: tokenized
  • Между $ var и =: tokenized
  • Beetween = и 0: токенизированный
  • Beetween) и {: tokenized
  • Между {и?>: Токенизированный

Ответы [ 2 ]

1 голос
/ 28 января 2010

Я нашел решение. Обычно пробелы игнорируются после открытых тегов php: <?php, <?, но не <?=

UPDATE

Это заняло 2 часа, но я понял поведение :). <?php и <? также получают следующий символ пробела или символ новой строки (предшествует \ r или нет). Остальные пробелы анализируются в других токенах, но группируются, если они следуют за первым пробелом. Позвольте мне лучше объяснить ваши примеры:

<?php echo "test"?>

Жетоны: "<?php", "echo" ....

<?php    echo "test"?>

Жетоны: "<?php", "(оставшиеся пробелы)", "echo" ...

Еще один пример с новыми строками:

<?php
echo "test"
?>

Жетоны: "<?php \ n", "echo" ....

<?php


echo "test"
?>

Жетоны: "<?php \ n", "\ n \ n (оставшиеся новые строки)", "echo" ....

Я тестировал его весь день, поэтому я уверен, что он так себя ведет.

1 голос
/ 28 января 2010

На самом деле, это никогда не игнорируется. Zend lexer всегда возвращает пробел для выделения / отступа.

"<?php if" (one space) is two tokens: "<?php " -- note the space -- and "if") 
"<?php  if" (two spaces) is three tokens: "<?php ", T_WHITESPACE + "if"

пример:

$t = token_get_all("<?php echo 1;?>");
echo token_name($t[1][0]); // T_ECHO

$t = token_get_all("<?php       echo 1;?>");
echo token_name($t[1][0]); // T_WHITESPACE
...