Поиск устаревших функций

slateclub

Постоялец
Регистрация
5 Ноя 2008
Сообщения
71
Реакции
4
Возникла необходимость поиска устаревших функций во всех файлах скрипта. В связи с этим набросал такую программку (может кому-то это тоже пригодится как и мне)
PHP:
<?php
//error_reporting(E_ALL & !~E_NOTICE);
header('Content-Type: text/html; charset=utf-8');
//--- устаревшие функции
$patterns=array('call_user_method', 'call_user_method_array', 'define_syslog_variables', 'dl', 'ereg', 'ereg_replace', 'eregi', 'eregi_replace', 'set_magic_quotes_runtime', 'session_register', 'session_unregister', 'session_is_registered', 'set_socket_blocking', 'split', 'spliti', 'sql_regcase', 'mysql_db_query', 'mysql_escape_string', 'setlocale', 'is_dst');
//--- поиск строки
function searchStr($pattern, $string){
    if (preg_match('/\b'.$pattern.'\b/u', $string)){ return 1; }
        return 0;
}
//--- проверка на картинку
function searchImages($string){
    if (preg_match('/\.(?:jp(?:e?g|e|2)|gif|png|tiff?|bmp|ico)$/i', $string)){ return 1; }
        return 0;
}
//--- рекурсивное сканирование
function getArrayFiles($path_dir) {
    $array_path = array();
    $dir = new RecursiveDirectoryIterator($path_dir);
    foreach(new RecursiveIteratorIterator($dir) as $val) {
        if($val->isFile()) {     
            $array_path[] = $val->getPathname();
        }
    }
    return $array_path;
}
//--- список текущих папок в директории
function getArrayDir() {
    $array_dir = array();
    if ($handle = opendir('.')) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != ".." && is_dir($entry)) {
                $array_dir[]=$entry;
            }
        }
        closedir($handle);
    }
    return $array_dir;
}
$dirArr=getArrayDir();
?>
<h3>Поиск упоминания в файлах директории</h3>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']?>">
    <p>Папка поиска:
    <select size="1" name="D1">
    <option selected <?php if ($_POST['D1']){echo 'value="'.$_POST['D1'].'">'.$_POST['D1']; } else {echo 'value=".">Выбрать папку';} ?></option>
    <?php
    foreach ($dirArr as $d){
        echo '<option value="'.$d.'">'.$d.'</option>';
    }
    ?>
    </select>
    <p>Поиск устаревших функций? <input type="checkbox" name="C1" value="ON"></p>
    <p>Или строка поиска: <input type="text" name="T1" size="20" value="<?php echo @$_POST['T1']; ?>"></p>
    <p><input type="submit" value="Найти" name="B1"></p>
</form>
<?php
if ($_SERVER['REQUEST_METHOD']=='POST'){
    //$pattern=preg_quote($_POST['T1']);
    $pattern=$_POST['T1'];
    if ($pattern=='' && $_POST['C1']!='ON') {
        echo '<b>Нужно указать строку для поиска или отметить "Поиск устаревших функций"!</b>'; exit;
    }
    if ($_POST['D1']==''){ $dir='.'; } else { $dir=$_POST['D1']; }
    //---
    $arr=getArrayFiles($dir);
    $c=count($arr);
    //---
    for($i=0;$i<$c;$i++){
        if(searchImages($v)){
            continue;
        } else {
            $fileArr=file($arr[$i]);
            if($_POST['C1']=='ON'){
                foreach($fileArr as $numLine=>$line){
                    foreach ($patterns as $pat){
                        if (searchStr($pat, $line)){
                            echo 'Функция <font color="#0000FF"><b>'.$pat.'</b></font> в файле: <font color="#008000"><b>'.$arr[$i].'</b></font> в строке <b>('.($numLine+1).')</b><br/>';
                        }
                    }
                }
            } else {
                foreach($fileArr as $numLine=>$line){
                    if (searchStr($pattern, $line)){
                        echo 'Запись <font color="#0000FF"><b>'.$pattern.'</b></font> встретилась в файле: <font color="#008000"><b>'.$arr[$i].'</b></font> в строке <b>('.($numLine+1).')</b><br/>';
                    }
                }
            }
        }
    }
}

PS Вопрос к знатокам регулярных выражений: как можно найти в строке наличие переменной (например "$_POST['user']", или просто "$var=")
 
В регулярном выражении нужно экранировать спец символы $][ \$_POST\['user'\]
Или использовать \Q \E
\Q$_POST['user']\E

В целях повышения быстродействия предлагаю не делать 20 вызовов поиска для каждой строки, а собрать все 20 имен функций в одно выражение.
Фрагмент
PHP:
                foreach($fileArr as $numLine=>$line){
                    foreach ($patterns as $pat){
                        if (searchStr($pat, $line)){
                            echo 'Функция <font color="#0000FF"><b>'.$pat.'</b></font> в файле: <font color="#008000"><b>'.$arr[$i].'</b></font> в строке <b>('.($numLine+1).')</b><br/>';
                        }
                    }
                }
Заменить этим
PHP:
                $pattern = '/\b(?:'.implode('|', $patterns).')(?=\s*\()/';
                foreach($fileArr as $numLine=>$line){
                        if (preg_match($pattern, $line, $match)){
                            echo 'Функция <font color="#0000FF"><b>'.$match[0].'</b></font> в файле: <font color="#008000"><b>'.$arr[$i].'</b></font> в строке <b>('.($numLine+1).')</b><br/>';
                        }              
                }

Или с preg_grep одним махом отобрать все интересующие строки, а дальше preg_match только уточнить какая именно функция совпала.
PHP:
                    $pattern = '/\b(?:'.implode('|', $patterns).')(?=\s*\()/';
                    foreach (preg_grep($pattern, $fileArr) as $numLine=>$line){
                            preg_match($pattern, $line, $match);
                            echo 'Функция <font color="#0000FF"><b>'.$match[0].'</b></font> в файле: <font color="#008000"><b>'.$arr[$i].'</b></font> в строке <b>('.($numLine+1).')</b><br/>';
                                          
                    }
 
Последнее редактирование:
не силен я в регулярках, но вот что получилось это что бы найти $var=
/([\$].{4})/
хотя может лучше так?
/\$.*?var\=/
тоже фигня...лучше так
'/\$var\=/'
 
Последнее редактирование:
Ценно было бы, если бы скрипт не просто искал нужные функции, а заменял на их аналоги.
Например ereg_replace можно смело заменить preg_replace, а mysql_escape_string на mysql_real_escape_string
 
Назад
Сверху