token_get_all whitespaces行为

时间:2010-01-28 14:15:20

标签: php javascript tokenize

我不知道是否有人可以帮助我,但无论如何我都会问。我正在创建一个像javascript编写的php token_get_all这样的函数。这个函数应该“标记”一个给定的PHP代码,但我有一些空格问题。

在php中执行token_get_all函数我发现只有一些空格被认为是令牌,其他空格被忽略。

有人可以解释一下这个函数如何用空格表示?你有没有找到一些关于它的文件?

更新

<?php
if ($var == 0)
{
?>
  • Beetween php和if:ignored
  • Beetween if和(:tokenized
  • Beetween $ var和=:tokenized
  • Beetween =和0:tokenized
  • Beetween)和{:tokenized
  • Beetween {和?&gt;:tokenized

2 个答案:

答案 0 :(得分:1)

实际上,它永远不会被忽视。 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

答案 1 :(得分:1)

我找到了解决方案。通常在php打开标记后忽略空格:<?php<?但不是<?=

更新

花了2个小时,但我明白了行为:)。 <?php<?还会获得以下空格字符或新行char(以\ 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”....

我一整天都在测试它,所以我确信它的行为就像这样。