PDA

Просмотр полной версии : Сжатие php кода путём удаления комментариев, пробелов и т.п.


-Hormold-
29.03.2009, 20:20
Собственно, функции:

Максимальное сжатие:
<?
function compress_code($code) {
$array = token_get_all($code);
$ret = "";
for($i = 0; $i < count($array); $i++) {
$obj = $array[$i];
if(is_string($obj))
$ret .= $obj;
else {
$a = $obj[0];
$s = $obj[1];
if($a == T_ABSTRACT || $a == T_CASE || $a == T_CLASS || $a == T_CLONE || $a == T_CONST || $a == T_DECLARE || $a == T_ECHO || $a == T_ELSE || $a == T_FINAL || $a == T_FUNCTION || $a == T_GLOBAL || $a == T_INCLUDE || $a == T_INCLUDE_ONCE || $a == T_INTERFACE || $a == T_NEW || $a == T_OLD_FUNCTION || $a == T_PRINT || $a == T_PRIVATE || $a == T_PUBLIC || $a == T_PROTECTED || $a == T_RETURN || $a == T_REQUIRE || $a == T_REQUIRE_ONCE || $a == T_STATIC || $a == T_PROTECTED || $a == T_THROW || $a == T_USE || $a == T_VAR || $a == T_LNUMBER)
$ret .= strtolower($s)." ";
if($a == T_AND_EQUAL || $a == T_CHARACTER || $a == T_CONCAT_EQUAL || $a == T_CONSTANT_ENCAPSED_STRING || $a == T_CURLY_OPEN || $a == T_DEC || $a == T_DIV_EQUAL || $a == T_DOLLAR_OPEN_CURLY_BRACES || $a == T_DOUBLE_ARROW || $a == T_DOUBLE_COLON || $a == T_INC || $a == T_INLINE_HTML || $a == T_IS_EQUAL || $a == T_IS_GREATER_OR_EQUAL || $a == T_IS_IDENTICAL || $a == T_IS_SMALLER_OR_EQUAL || $a == T_MINUS_EQUAL || $a == T_MUL_EQUAL || $a == T_MOD_EQUAL || $a == T_OPEN_TAG_WITH_ECHO || $a == T_OR_EQUAL || $a == T_PAAMAYIM_NEKUDOTAYIM || $a == T_PLUS_EQUAL || $a == T_SL || $a == T_SL_EQUAL || $a == T_SR || $a == T_SR_EQUAL || $a == T_START_HEREDOC || $a == T_STRING || $a == T_ENCAPSED_AND_WHITESPACE || $a == T_NUM_STRING || $a == T_STRING_VARNAME || $a == T_XOR_EQUAL || $a == T_OBJECT_OPERATOR || $a == T_IS_NOT_EQUAL || $a == T_IS_NOT_IDENTICAL)
$ret .= $s;
if($a == T_AS || $a == T_BOOLEAN_AND || $a == T_BOOLEAN_OR || $a == T_EXTENDS || $a == T_IMPLEMENTS || $a == T_INSTANCEOF || $a == T_LOGICAL_AND || $a == T_LOGICAL_OR || $a == T_LOGICAL_XOR)
$ret .= " ".strtolower($s)." ";
if($a == T_CLASS_C || $a == T_DIR || $a == T_FILE || $a == T_FUNC_C || $a == T_LINE || $a == T_METHOD_C || $a == T_NS_C)
$ret .= strtoupper($s);
if($a == T_ARRAY || $a == T_ARRAY_CAST || $a == T_BOOL_CAST || $a == T_BREAK || $a == T_CATCH || $a == T_CONTINUE || $a == T_DEFAULT || $a == T_DO || $a == T_DOUBLE_CAST || $a == T_ELSEIF || $a == T_EMPTY || $a == T_ENDDECLARE || $a == T_ENDFOR || $a == T_ENDFOREACH || $a == T_ENDIF || $a == T_ENDSWITCH || $a == T_ENDWHILE || $a == T_WHILE || $a == T_EVAL || $a == T_EXIT || $a == T_FOR || $a == T_FOREACH || $a == T_HALT_COMPILER || $a == T_IF || $a == T_INT_CAST || $a == T_ISSET || $a == T_LIST || $a == T_OBJECT_CAST || $a == T_STRING_CAST || $a == T_SWITCH || $a == T_TRY || $a == T_UNSET || $a == T_UNSET_CAST)
$ret .= strtolower($s);
if($a == T_CLOSE_TAG)
$ret .= " ".$s;
if($a == T_DNUMBER)
$ret .= $s." ";
if($a == T_END_HEREDOC) {
$ret .= $s.";\r\n";
$i++;
}
if($a == T_OPEN_TAG)
$ret .= trim(strtolower($s))." ";
if($a == T_VARIABLE) {
if($s == '$HTTP_POST_VARS')
$s = '$_POST';
if($s == '$HTTP_GET_VARS')
$s = '$_GET';
if($s == '$HTTP_REQUEST_VARS')
$s = '$_REQUEST';
if($s == '$HTTP_COOKIE_VARS')
$s = '$_COOKIE';
if($s == '$HTTP_POST_FILES')
$s = '$_FILES';
if($s == '$HTTP_SERVER_VARS')
$s = '$_SERVER';
if($s == '$HTTP_SESSION_VARS')
$s = '$_SESSION';
$ret .= $s;
}
}
}
$ret = preg_replace("#<\?php#is","<?",$ret);
$ret = preg_replace("#php \?>#is","?>",$ret);
$ret = str_replace("<? ?>","",$ret);
return $ret;
}
?>
Только удаление комментраиев:
function remove_comments($code) {
$array = token_get_all($code);
$ret = "";
for($i = 0; $i < count($array); $i++) {
$obj = $array[$i];
if(is_string($obj))
$ret .= $obj;
else {
if(!strstr(token_name($obj[0]),"COMMENT"))
$ret .= $obj[1];
}
}
return $ret;
}

Пример:
$cnt=compress_code(file_get_contents('script.php') );
file_put_contents('script.php',$cnt);


(C) Eugen, с tem.dp.ua

Krist_ALL
29.03.2009, 20:28
ИНтересно, но безполезно)

-Hormold-
29.03.2009, 20:29
Почему, иногда несколько бывает даже очень полезно =)

[Raz0r]
29.03.2009, 20:48
автор видимо не в курсе, что существует функция php_strip_whitespace()

-Hormold-
29.03.2009, 20:56
Наверное =)
Но там же не только комменты...

Sharky
29.03.2009, 20:57
против я этих сжатий которые только сделают код нечитабельным а уменьшат на пару килобайт

Pashkela
29.03.2009, 20:59
2 Sharky:

а зачем тебе читабельный шелл, например?

rcc0023
29.03.2009, 21:18
Есть небольшой недочет..

else {$l_kod=7 ;};

целых два огромнейших пробела!! ;)

BlackSun
29.03.2009, 21:25
$code = '<? /* тут типа куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча куча кода */ ?>';
$code = base64_encode(gzdeflate($code));
echo $code;

Распаковка - base64 decode && gzinflate && eval

zeppe1in
29.03.2009, 22:10
-Hormold-
надо ещо все переменные переименовывать в короткие названия типо, $a $b.
а потом base64_encode(gzdeflate($code). для шела самое то.

Sn@k3
29.03.2009, 23:17
hormold , реал бесполезно)) ну если конечно идёт вопрос на мегабайты))) их труднее заливать, но в нае время пох на это.

Sharky
30.03.2009, 01:09
2 Sharky:

а зачем тебе читабельный шелл, например?
а если не например?

Soviet[HZ]
30.03.2009, 01:24
А если не например, то какая в этом практическая польза? хоть что нить....

nerezus
30.03.2009, 02:34
Нету пользы.