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

Тема в разделе "Как сделать...", создана пользователем slateclub, 23 апр 2015.

  1. slateclub

    slateclub Постоялец

    Регистр.:
    5 ноя 2008
    Сообщения:
    69
    Симпатии:
    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=")
     
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    188
    Симпатии:
    227
    В регулярном выражении нужно экранировать спец символы $][ \$_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/>';
                                              
                        }
     
    Последнее редактирование: 24 апр 2015
  3. vitbsd

    vitbsd Постоялец

    Регистр.:
    26 ноя 2009
    Сообщения:
    111
    Симпатии:
    76
    не силен я в регулярках, но вот что получилось это что бы найти $var=
    /([\$].{4})/
    хотя может лучше так?
    /\$.*?var\=/
    тоже фигня...лучше так
    '/\$var\=/'
     
    Последнее редактирование: 23 апр 2015
  4. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Ценно было бы, если бы скрипт не просто искал нужные функции, а заменял на их аналоги.
    Например ereg_replace можно смело заменить preg_replace, а mysql_escape_string на mysql_real_escape_string