1

誰かが私を助けることができるかどうかはわかりませんが、とにかく尋ねます。私はtoken_get_alljavascriptで書かれたphpのような関数を作成しています。この関数は、指定されたphpコードを「トークン化」する必要がありますが、空白に問題があります。

token_get_allPHPで関数を実行すると、一部の空白のみがトークンと見なされ、他の空白は無視されることがわかります。

この関数が空白でどのように動作するかを誰かに説明してもらえますか?それについてのドキュメントを見つけたことがありますか?

アップデート

<?php
if ($var == 0)
{
?>
  • phpとifの間:無視されます
  • ifと(:トークン化
  • $ varと=の間:トークン化
  • =と0の間:トークン化
  • )と{の間:トークン化
  • {と?>の間:トークン化
4

2 に答える 2

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
于 2010-01-28T14:56:39.620 に答える
1

私は解決策を見つけました。通常、php の開始タグの後の空白は無視され<?phpます<?:<?=

アップデート

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"....

一日中テストしたので、このように動作すると確信しています。

于 2010-01-28T15:26:20.263 に答える