Tokenizer在php中不起作用

时间:2013-12-08 16:46:26

标签: php tokenize

<?php
$input = nl2br($_POST['input']);
$newStr  = '';
$commentTokens = array(T_COMMENT);
if (defined('T_DOC_COMMENT'))
$commentTokens[] = T_DOC_COMMENT; // PHP 5
if (defined('T_ML_COMMENT'))
$commentTokens[] = T_ML_COMMENT;  // PHP 4
$tokens = token_get_all($input);
foreach ($tokens as $token) {    
if (is_array($token)) {
    if (in_array($token[0], $commentTokens))
        continue;
    $token = $token[1];
}
/*test*/
    $newStr .= $token;
}
echo $newStr;
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<textarea name="input" id="" cols="50" rows="30"></textarea>
<input type="submit">
</form>

出于某种原因,它不会删除注释,只会删除开头的第一行并按原样打印代码。

我做错了吗?

1 个答案:

答案 0 :(得分:0)

如果您不添加PHP打开/关闭标记,则评论将为T_INLINE_HTML令牌。

查看token_get_all处的示例。

更新:

如果你发布PHP代码nl2br没有意义,因为它会在代码中添加<br>标记。 请尝试以下方法:

$input = '<?php '.$_POST['input'].' ?>';

UPDATE2:

如果源只是HTML,则使用DOM解析器。请参阅此处的示例:remove comments from html source code

如果源是PHP和HTML的混合,您还需要混合使用tokenizer和DOM解析器。因此,您将使用您拥有的代码以及您使用DOM解析器解析的令牌T_INLINE_HTML所获得的内容。