php_strip_whitespace

(PHP 5, PHP 7, PHP 8)

php_strip_whitespace返回删除了注释和空白的源代码

描述

php_strip_whitespace(string $filename): string

返回 filename 中的 PHP 源代码,其中删除了 PHP 注释和空白。这对于确定脚本中实际代码量与注释量之间的比例可能很有用。这类似于从 命令行 使用 php -w

参数

filename

PHP 文件的路径。

返回值

成功时返回剥离后的源代码,失败时返回空字符串。

注意:

此函数会尊重 short_open_tag ini 指令的值。

示例

示例 #1 php_strip_whitespace() 示例

<?php
// PHP 注释在这里

/*
* 另一个 PHP 注释
*/

echo php_strip_whitespace(__FILE__);
// 换行符被视为空白,也会被删除:
do_nothing();
?>

以上示例将输出

<?php
 echo php_strip_whitespace(__FILE__); do_nothing(); ?>

请注意 PHP 注释消失了,第一个 echo 语句后的空白和换行符也消失了。

添加笔记

用户贡献的笔记 5 笔记

gelamu at gmail dot com
16 年前
使用此函数可以压缩您的 PHP 源代码。

<?php

function compress_php_src($src) {
// Whitespaces left and right from this signs can be ignored
static $IW = array(
T_CONCAT_EQUAL, // .=
T_DOUBLE_ARROW, // =>
T_BOOLEAN_AND, // &&
T_BOOLEAN_OR, // ||
T_IS_EQUAL, // ==
T_IS_NOT_EQUAL, // != or <>
T_IS_SMALLER_OR_EQUAL, // <=
T_IS_GREATER_OR_EQUAL, // >=
T_INC, // ++
T_DEC, // --
T_PLUS_EQUAL, // +=
T_MINUS_EQUAL, // -=
T_MUL_EQUAL, // *=
T_DIV_EQUAL, // /=
T_IS_IDENTICAL, // ===
T_IS_NOT_IDENTICAL, // !==
T_DOUBLE_COLON, // ::
T_PAAMAYIM_NEKUDOTAYIM, // ::
T_OBJECT_OPERATOR, // ->
T_DOLLAR_OPEN_CURLY_BRACES, // ${
T_AND_EQUAL, // &=
T_MOD_EQUAL, // %=
T_XOR_EQUAL, // ^=
T_OR_EQUAL, // |=
T_SL, // <<
T_SR, // >>
T_SL_EQUAL, // <<=
T_SR_EQUAL, // >>=
);
if(
is_file($src)) {
if(!
$src = file_get_contents($src)) {
return
false;
}
}
$tokens = token_get_all($src);

$new = "";
$c = sizeof($tokens);
$iw = false; // ignore whitespace
$ih = false; // in HEREDOC
$ls = ""; // last sign
$ot = null; // open tag
for($i = 0; $i < $c; $i++) {
$token = $tokens[$i];
if(
is_array($token)) {
list(
$tn, $ts) = $token; // tokens: number, string, line
$tname = token_name($tn);
if(
$tn == T_INLINE_HTML) {
$new .= $ts;
$iw = false;
} else {
if(
$tn == T_OPEN_TAG) {
if(
strpos($ts, " ") || strpos($ts, "\n") || strpos($ts, "\t") || strpos($ts, "\r")) {
$ts = rtrim($ts);
}
$ts .= " ";
$new .= $ts;
$ot = T_OPEN_TAG;
$iw = true;
} elseif(
$tn == T_OPEN_TAG_WITH_ECHO) {
$new .= $ts;
$ot = T_OPEN_TAG_WITH_ECHO;
$iw = true;
} elseif(
$tn == T_CLOSE_TAG) {
if(
$ot == T_OPEN_TAG_WITH_ECHO) {
$new = rtrim($new, "; ");
} else {
$ts = " ".$ts;
}
$new .= $ts;
$ot = null;
$iw = false;
} elseif(
in_array($tn, $IW)) {
$new .= $ts;
$iw = true;
} elseif(
$tn == T_CONSTANT_ENCAPSED_STRING
|| $tn == T_ENCAPSED_AND_WHITESPACE)
{
if(
$ts[0] == '"') {
$ts = addcslashes($ts, "\n\t\r");
}
$new .= $ts;
$iw = true;
} elseif(
$tn == T_WHITESPACE) {
$nt = @$tokens[$i+1];
if(!
$iw && (!is_string($nt) || $nt == '$') && !in_array($nt[0], $IW)) {
$new .= " ";
}
$iw = false;
} elseif(
$tn == T_START_HEREDOC) {
$new .= "<<<S\n";
$iw = false;
$ih = true; // in HEREDOC
} elseif($tn == T_END_HEREDOC) {
$new .= "S;";
$iw = true;
$ih = false; // in HEREDOC
for($j = $i+1; $j < $c; $j++) {
if(
is_string($tokens[$j]) && $tokens[$j] == ";") {
$i = $j;
break;
} else if(
$tokens[$j][0] == T_CLOSE_TAG) {
break;
}
}
} elseif(
$tn == T_COMMENT || $tn == T_DOC_COMMENT) {
$iw = true;
} else {
if(!
$ih) {
$ts = strtolower($ts);
}
$new .= $ts;
$iw = false;
}
}
$ls = "";
} else {
if((
$token != ";" && $token != ":") || $ls != $token) {
$new .= $token;
$ls = $token;
}
$iw = true;
}
}
return
$new;
}

?>

例如
<?php

$src
= <<<EOT
<?php
// some comment
for (
$i = 0; $i < 99; $i ++ ) {
echo "i=
${ i }\n";
/* ... */
}
/** ... */
function abc() {
return "abc";
};

abc();
?>
<h1><?= "Some text " . str_repeat("_-x-_ ", 32);;; ?></h1>
EOT;
var_dump(compress_php_src($src));
?>

结果是
string(125) "<?php for(=0;<99;++){echo "i=\n";}function abc(){return "abc";};abc(); ?>
<h1><?="Some text ".str_repeat("_-x-_ ",32)?></h1>"
Jouni
16 年前
如果您只想从字符串中删除多余的空白,请参阅 preg_replace 文档中的示例“Strip whitespace”(https://php.net/manual/en/function.preg-replace.php)。
flconseil at yahoo dot fr
18 年前
请注意,此函数使用输出缓冲机制。

如果您提供“流包装”路径作为参数,则在调用期间由流包装器输出的任何内容(例如跟踪消息)都不会显示在屏幕上,而是会被插入到 php_strip_whitespace 的结果中。

如果您稍后执行此剥离后的代码,它将显示在 php_strip_whitespace 执行期间应该输出的消息!
razvan_bc at yahoo dot com
5 年前
我注意到,在使用 php_strip_whitespace 压缩的 45=75kb php 文件上,我的 apache benchmark .bat 测试中得到最慢的速度结果。因此,对一个普通的 php 文件进行 10 次测试,再对一个压缩文件进行 10 次测试,计算数学平均值,我发现普通的 php 文件速度最快。

好吧,看到这些结果,我认为这很不错,但是如果我们结合这些“方法”:如果我使用此函数的部分缩小方法会怎样?

以下是代码
(如果您在 xampp 中运行此代码,并且您是初学者,则您将在 Firefox 中获得一个空白页面,但是如果您右键单击它,然后单击选项“查看源代码”,您将获得通过注释和制表符部分剥离的 php)

<?php
/* hi there !!!
here are the comments */
//another try

echo removecomments('index.php');

/* hi there !!!
here are the comments */
//another try
function removecomments($f){
$w=Array(';','{','}');
$ts = token_get_all(php_strip_whitespace($f));
$s='';
foreach(
$ts as $t){
if(
is_array($t)){
$s .=$t[1];
}else{
$s .=$t;
if(
in_array($t,$w) ) $s.=chr(13).chr(10);
}
}

return
$s;
}

?>
TK
15 年前
我之前一直在寻找一种从源文件中剥离 php 注释的方法,但没有找到太多。我编写了以下函数来使用标记器来完成这个任务。我在整个 phpMyAdmin 安装中测试过它,之后它运行良好......所以应该可以正常使用。您还可以指定任意数量的标记来剥离,例如 T_WHITESPACE,而不是默认的 T_COMMENT 和 T_DOC_COMMENT。

希望有人发现它有用。

<?php

function strip_tokens($code) {

$args = func_get_args();
$arg_count = count($args);

// 如果没有指定要剥离的标记,则默认剥离注释
if( $arg_count === 1 ) {
$args[1] = T_COMMENT;
$args[2] = T_DOC_COMMENT;
}

// 构建一个用于剥离标记的键值对数组
for( $i = 1; $i < $arg_count; ++$i )
$strip[ $args[$i] ] = true;

// 设置一个用于保留行号的换行符键值对数组
$newlines = array("\n" => true, "\r" => true);

$tokens = token_get_all($code);

reset($tokens);

$return = '';

$token = current($tokens);

while(
$token ) {

if( !
is_array($token) )

$return.= $token;

elseif( !isset(
$strip[ $token[0] ]) )

$return.= $token[1];

else {

// 仅返回标记的换行符以保留行号
for( $i = 0, $token_length = strlen($token[1]); $i < $token_length; ++$i )
if( isset(
$newlines[ $token[1][$i] ]) )
$return.= $token[1][$i];

}

$token = next($tokens);

}
// 当还有更多标记时

return $return;

}
// 函数

?>
To Top