define().Чтобы найти таковые пользуюсь, ну например этим регулярным выражением
$df=preg_match_all("/define\s*\(\s*(\'|\")(\w*)(\'|\")\s*,[^,]*,\s*\w*\s*\)/i",$text,$mass_def,PREG_SET_ORDER);
if($df){
foreach($mass_def as $k){
$a[]=$k[2];
}
}
Здесь все понятно.В массиве $a записаны имена констант!
Нужно с помощью регулярных выражений заменить эти названия на другие...
Возьмем к примеру константу
define("TABLE",'test',true);
Проблем не возникает с заменой,но а вот если в скрипте встречается такая строчка:
...
$text='TABLE - Хороший тег в HTML';
...
и тоже произведется замена "TABLE".Естественно заменять в таких ситуациях не нужно!:(Как объяснить с помощью регулярного выражения что перед названием должно стоять четное количество кавычек таких (') или таких ("), т.е. заменять только те названия,которые не между кавычками!В сети ничего подобного не нашел!:(Всем Спасибо!
Спустя 1 час, 16 минут, 31 секунда (30.11.2010 - 22:51) sergeiss написал(а):
Цитата (igorechek87 @ 30.11.2010 - 22:35) |
Есть задача переименовать константы в php файле, созданные функцией define(). |
А можно уточнить, откуда такая задача появилась???
Спустя 5 минут, 55 секунд (30.11.2010 - 22:57) igorechek87 написал(а):
Для обфускации кода ...
Очень удивляют ответы:"А зачем?","А почему?"...
Уж лучше без них!
Буду благодарен за идеи,наводки!а попусту можно не писать ...
Очень удивляют ответы:"А зачем?","А почему?"...
Уж лучше без них!
Буду благодарен за идеи,наводки!а попусту можно не писать ...
Спустя 1 минута, 52 секунды (30.11.2010 - 22:59) twin написал(а):
Я вот только не понял. Вот код
которую из них надо заменить?
define("TABLE",'test',true);
$text='TABLE - Хороший тег в HTML';
echo TABLE;
которую из них надо заменить?
Спустя 5 минут, 57 секунд (30.11.2010 - 23:05) igorechek87 написал(а):
echo TABLE;
Спустя 10 минут, 34 секунды (30.11.2010 - 23:15) sergeiss написал(а):
Цитата (igorechek87 @ 30.11.2010 - 23:57) |
Очень удивляют ответы:"А зачем?","А почему?"... |
Объясняю Уже много раз было так, что ответы на такие вопросы помогали человеку лучше понять, что же он хочет сделать. А тем, кто отвечает, лучше понять, КАК это сделать.
Зачастую после ответов на такие вопросы человек делает алгоритм как-то по-другому, потому что ему подсказывали путь решения проблемы, о котором он не знал.
Естественно, тебя никто не обязывает отвечать... Дело сугубо личное.
По теме
В данном случае я лично сначала нашел бы строки, где есть определение констант, и в регулярку загонял бы только их. Куда как быстрее будет работать...
PS. Оффтоп. Вот пример того, как мнение человека об алгоритме изменилось в процессе развития темы, совсем недавно было: http://phpforum.ru/index.php?showtopic=37116&hl=.
Хотел сделать на JS, сделал в итоге на ПХП. Но получил именно то, что хотел.
Спустя 1 минута, 52 секунды (30.11.2010 - 23:17) twin написал(а):
Задача эта не из легких. Одной регуляркой тут вряд ли возможно решить.
Ведь в коде могут встретиться и зкранированные кавычки и кавычки в апострофах и апострофы в кавычках и одинарные апострофы в тексте и так далее.
Я как то решал подобную фишку, заменял все что в кавычках на токены, потом обрабатывал оставшийся текст и возвращал обратно. Если вспомню, напишу.
Ведь в коде могут встретиться и зкранированные кавычки и кавычки в апострофах и апострофы в кавычках и одинарные апострофы в тексте и так далее.
Я как то решал подобную фишку, заменял все что в кавычках на токены, потом обрабатывал оставшийся текст и возвращал обратно. Если вспомню, напишу.
Спустя 23 минуты, 28 секунд (30.11.2010 - 23:41) twin написал(а):
Ну вот как то так
PS работать будет только под UTF-8
// тут твой код
$tmp = array();
function replQuote($out)
{
global $tmp;
static $num = 0;
$key = 'ᐁ'. $num++ .'ᐃ';
$tmp[$key] = $out[0];
return $key;
}
$text = preg_replace_callback("#'[^'\\\]*(\\\.[^'\\\]*)*'#uis", 'replQuote', $text);
$text = preg_replace_callback('#"[^"\\\]*(\\\.[^"\\\]*)*"#uis', 'replQuote', $text);
$text = str_replace($a, 'REPL', $text); // тут твоя замена
echo str_replace(array_keys($tmp), array_values($tmp), $text);
PS работать будет только под UTF-8
Спустя 28 минут, 11 секунд (1.12.2010 - 00:09) twin написал(а):
Подправил, так надежнее.
Спустя 21 минута, 54 секунды (1.12.2010 - 00:31) igorechek87 написал(а):
Что-то не робэ!Выводит пустой результат...
Спустя 32 минуты, 5 секунд (1.12.2010 - 01:03) twin написал(а):
Кодировка у тебя какая?
На вот тебе обфускатор))))
Прикололся на ночь глядя.
На вот тебе обфускатор))))
Прикололся на ночь глядя.
<?php
$text = file_get_contents('test.php');
$tmp1 = $tmp2 = $tmp3 = array();
function createString()
{
$arr_num = array_fill(0, 5, '0');
$arr_str = array_fill(0, 5, 'O');
$arr = array_merge($arr_num, $arr_str);
shuffle($arr);
return implode('', $arr);
}
function createName()
{
static $arr = array();
do
{
$name = createString();
}
while(in_array($name, $arr));
$arr[] = $name;
return 'O'. $name;
}
function replQuote($out)
{
global $tmp1;
static $num = 0;
$key = 'ᐁ'. $num++ .'ᐃ';
$tmp1[$key] = $out[0];
return $key;
}
function replConst($out)
{
global $tmp2, $tmp3;
static $num = 0;
$key = 'ᐃ'. $num++ .'ᐁ';
$name = createName();
$tmp3[$out[2]] = $name;
$tmp2[$key] = $out[1] . $name . $out[1];
return 'define('. $key;
}
$text = preg_replace_callback('#define\s*\(\s*(\'|")([a-z0-9_]+?)(\'|")#i', 'replConst', $text);
$text = preg_replace_callback("#'[^'\\\]*(\\\.[^'\\\]*)*'#uis", 'replQuote', $text);
$text = preg_replace_callback('#"[^"\\\]*(\\\.[^"\\\]*)*"#uis', 'replQuote', $text);
$text = str_replace(array_keys($tmp3), array_values($tmp3), $text);
$text = str_replace(array_keys($tmp1), array_values($tmp1), $text);
$text = str_replace(array_keys($tmp2), array_values($tmp2), $text);
highlight_string($text);
Спустя 1 минута, 41 секунда (1.12.2010 - 01:05) twin написал(а):
Вот для проверки
<?php
define("TABLE",'test',true);
$text='TABLE - Хороший \'тег в HTML';
echo TABLE;
define('CONST','test',true);
echo CONST;