2024 年日本 PHP 研討會

php_strip_whitespace

(PHP 5, PHP 7, PHP 8)

php_strip_whitespace傳回已移除註釋和空白的原始碼

說明

php_strip_whitespace(字串 $filename): 字串

返回移除 PHP 註解和空白字元後的 `filename 檔案中的 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
// 一些註解
for (
$i = 0; $i < 99; $i ++ ) {
echo "i=
${ i }\n";
/* ... */
}
/** ... */
function abc() {
return "abc";
};

abc();
?>
<h1><?= "一些文字 " . 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><?="一些文字 ".str_repeat("_-x-_ ",32)?></h1>"
Jouni
17 年前
如果您只想移除字串中的多餘空白,請參閱 preg_replace 文件 (https://php.dev.org.tw/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
/* 您好 !!!
這裡是註釋 */
//另一種嘗試

echo removecomments('index.php');

/* 您好 !!!
這裡是註釋 */
//另一種嘗試
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 安裝程式上測試過,之後它可以正常運作…所以應該沒問題。您也可以指定任意數量的 token 來移除,例如 T_WHITESPACE,而不是預設的 T_COMMENT 和 T_DOC_COMMENT。

希望有人覺得它有用。

<?php

function strip_tokens($code) {

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

// if no tokens to strip have been specified then strip comments by default
if( $arg_count === 1 ) {
$args[1] = T_COMMENT;
$args[2] = T_DOC_COMMENT;
}

// build a keyed array of tokens to strip
for( $i = 1; $i < $arg_count; ++$i )
$strip[ $args[$i] ] = true;

// set a keyed array of newline characters used to preserve line numbering
$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 {

// return only the token's newline characters to preserve line numbering
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);

}
// while more tokens

return $return;

}
// function

?>
To Top