Просто подумайте, существуют ли класс или функция, позволяющая обнаруживать и заменять только php-код внутри php-файла. Я хочу, чтобы Obfuscate только PHP-код и не тронул HTML, и я не думаю, что preg_match — лучший способ сделать это. Пока у меня есть это:
function replace_between($str) {
require_once 'plugins/Obfuscator.php';
$search = "/(<?php )(.*?)( ?>)/";
$check_str = preg_match($search,$str,$match);
$sData = <<<'DATA'
echo $match[1];
DATA;
$sObfusationData = new Obfuscator($sData, 'Class/Code NAME');
$new = preg_replace($search,$sObfusationData,$str);
return $new;
Пример выше не работает по нескольким причинам, например, что я хочу получить.
Обнаружение кода PHP в файлах со смешанным содержимым (PHP / HTML) с помощью PHP для
Затемнение?
Вы можете использовать расширение PHP tokenizer для достижения этого должным образом. Примером является функция ниже:
function findPHP($string){
if(!is_string($string)) return false;
$tokens=token_get_all($string);
$php_code='';
$result=array();
$start=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
$start=true;
continue;
}
if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
$start=false;
$result[]=$php_code;
$php_code='';
continue;
}
if($start){
if(is_array($token))
$php_code.=$token[1];
else
$php_code.=$token;
}
}
return $result;
}
print_r(findPHP(file_get_contents('get_path.php')));
Эта функция обнаруживает только PHP-код в любом файле со смешанным содержимым и возвращает массив, содержащий все вхождения PHP-кода.
Тогда все, что вам нужно сделать, это использовать свой выключатель по своему усмотрению. Все это говорит о том, что вы можете слегка изменить вышеприведенную функцию для достижения своей цели. Пример:
function find_and_offuscate_PHP($string){
if(!is_string($string)) return false;
$tokens=token_get_all($string);
$php_code='';
$result=array();
$start=false;
$from=false;
foreach($tokens as $key=>$token){
if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
$from=$key;
$start=true;
continue;
}
if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
$start=false;
$result[$from]=$php_code;
$from=false;
$php_code='';
continue;
}
if($start){
if(is_array($token))
$php_code.=$token[1];
else
$php_code.=$token;
unset($tokens[$key]);
}
}
if($start&&$from&&$php_code){
$result[$from]=$php_code;
unset($start,$from,$php_code);
}
// require_once 'plugins/Obfuscator.php';
$result=array_map(function($php_code){
// return new Obfuscator($php_code, 'Class/Code NAME');
return base64_encode($php_code);
},$result);
$tokens=array_map(function($token){return is_array($token)?$token[1]:$token;},$tokens);
foreach($result as $from=> $offuscated){
$tokens[$from] .= " $offuscated";
unset($result[$from]);
}
return join(' ',$tokens);
}
обратите внимание, что в этом коде я просто использую base64_encode для теста, но я сохраняю строки, которые используют ваш собственный offuscator, вам просто нужно раскомментировать, и функция будет готова к использованию в вашем приложении.
Других решений пока нет …