[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Переименовать константы в PHP файле
igorechek87
Здравствуйте!Есть задача переименовать константы в php файле, созданные функцией
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)
Очень удивляют ответы:"А зачем?","А почему?"...

Объясняю smile.gif Уже много раз было так, что ответы на такие вопросы помогали человеку лучше понять, что же он хочет сделать. А тем, кто отвечает, лучше понять, КАК это сделать.

Зачастую после ответов на такие вопросы человек делает алгоритм как-то по-другому, потому что ему подсказывали путь решения проблемы, о котором он не знал.

Естественно, тебя никто не обязывает отвечать... Дело сугубо личное.

По теме smile.gif
В данном случае я лично сначала нашел бы строки, где есть определение констант, и в регулярку загонял бы только их. Куда как быстрее будет работать...

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 написал(а):
Ну вот как то так
    

// тут твой код
$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;
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.