Jeg legede lige lidt med det. Følgende kode kan gøre det mere læsbart, men garanterer ikke at kildekoden er intakt, så den originale kildekode kan ikke umiddelbart erstattes med resultatet.
<?php
$s = file_get_contents('myscript.php'); // dit script
if($s === FALSE){
die('kunne ikke indlæse fil');
}
fix_characters();
fix_function_names();
fix_indentation();
echo '<pre>';
echo htmlentities($s);
echo '</pre>';
// =================================================
function fix_indentation(){
global $s;
$s = str_replace(' $x', '$x', $s);
$s = str_replace(' if(', 'if(', $s);
$s = str_replace(';', ";\r\n", $s);
$indentlevel = 0;
$parenteselevel = 0;
$len = strlen($s);
for($pos=0; $pos<$len; $pos++){
switch($s[$pos]){
case '(':
$parenteselevel++;
break;
case ')':
$parenteselevel--;
break;
case'{':
if($parenteselevel > 0) break;
$indentlevel++;
$s = substr_replace($s, "\r\n", $pos+1, 0);
$pos += 1;
$len += 2;
break;
case '}':
if($parenteselevel > 0) break;
$indentlevel--;
$s = substr_replace($s, "\r\n", $pos+1, 0);
$pos += 1;
$len += 2;
break;
case "\n":
if($indentlevel == 0) break;
$k = 0;
if(!($pos+1 < $len && $s[$pos+1] != '}')) $k++;
$fill = str_repeat(" ", ($indentlevel -$k) * 4);
$s = substr_replace($s, "$fill", $pos+1, 0);
$pos += $fill;
$len += $fill;
break;
}
}
}
function fix_function_names(){
/*
$x22="eregi";
$x23="header";
$x24="md5";
if($x22(...
*/
global $s;
// find første ordinal
if(preg_match('/\$x([\da-fA-F]+)\s*=/', $s, $m)){
$ordinal = hexdec($m[1]);
}else{
//echo '<hr>intet ændret i fix_function_names<hr>';
return;
}
// fix
while(preg_match('/\$x'.dechex($ordinal).'\s*="(.*?)"/', $s, $m)){
$obscured_name = "\$x".dechex($ordinal);
$real_name = $m[1];
$s = str_replace($obscured_name.'(', $real_name.'(', $s);
$ordinal++;
}
}
function replace_chars($m){
$m0 = $m[0];
if($m0[1] == 'x'){
// hex
$s = hexdec(substr($m0, 2));
}else{
// octal
$s = octdec(substr($m0, 1));
}
return chr($s);
}
function fix_characters(){
/*
http://php.net/manual/en/language.types.string.php\[0-7]{1,3} the sequence of characters matching the regular expression is a character in octal notation
\x[0-9A-Fa-f]{1,2} the sequence of characters matching the regular expression is a character in hexadecimal notation
*/
global $s;
$s = preg_replace_callback('/\\\[0-7]{1,3}|\\\x[0-9A-Fa-f]{1,2}/', "replace_chars", $s);
}
?>