57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
1

Поиск вхождений в файлах директории и вывод файлов на экран

19.06.2016, 16:39. Показов 2957. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Возник вопрос:
Предположим, у меня на сервере есть директория с огромным кол-вом файлов и поддиректорий. Каким образом я могу найти все вхождения слова (предположим) base64 во всех файлах данной директории и вывести их также куда-то (тоже в переменную или массив - чтобы я мог их вывести на экран? (файлы в поддиректориях тоже учитываются).
Также у меня может быть много подобных слов. Т.е.
PHP
1
2
3
4
5
$base64 = '(base64)';
$GLOBALS = '(GLOBALS)';
$base64 = '(base64)';
$POST = '(POST)';
$eval = '(eval)';
( каждому слову здесь присвоена своя переменная)

Добавлено через 1 минуту
Файлов и папок может быть очень много ( сотни тысяч).

Добавлено через 1 минуту
То что пока смог сделать -
PHP
1
2
3
4
5
6
7
<?php
 $base64 = '(base64)';
 if (strstr(file_get_contents('test.php'), $base64 !=false)
   echo "base64 найден"
 else 
  echo "base64 не найден"
  ?>
Добавлено через 4 минуты
Но это решение меня не устраивает, т.к. скрипт, по моей задумке, должен:
а) Выводить где он нашёл искомое слово
б) Искать строки не в одном файле, а в директории, где он лежит.
И ещё - можно ли сделать так, чтобы была некоторая кнопка, по нажатию на которой, скрипт автоматом удалял всю строку с вхождением в файлах, которые он нашёл?

Добавлено через 12 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
function includeAndSearch($search){
    $ret = array();
    $dir = glob('cat/*.php');//список .php файлов в папке cat
    foreach ($dir as $fname) {
        include $fname;//подключаем файлы
        if(isset($shema)){//если существует переменная с описанием
            //echo $shema,'<br/>';//в $shema ищем $search
            if(stripos(mb_strtolower($shema, 'utf-8'), $search)!==false){
                $ret[] = array('file'=>$fname, 'found'=>$shema);
            }
            unset($shema);
        }
    }
    return $ret;
}
 
$searcing = 'base64';
$res = includeAndSearch(mb_strtolower($searcing, 'utf-8'));
 
echo '<div>Слово: ',$searcing,'</div>';
 
$out = "<tr><td>Найдено</td><td>в</td></tr>\n";
foreach ($res as $el) {
    $out .= sprintf('<tr><td>%s</td><td>%s</td></tr>%s', $el['found'], $el['file'], "\n");
}
echo '<table border="1">',$out,'</table>'; 
?>
Вот ещё нашёл код - но с ним вопрос - как сделать так, чтобы можно было искать сразу несколько слов? (и в поддиректориях в том числе)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2016, 16:39
Ответы с готовыми решениями:

Вывод информации об определённых файлах из заданной директории в обратном алфавитном порядке имён этих файлов
Здравствуйте. Нужно создать пакетный файл, который будет выводить информацию о какой либо...

Поиск слова в файлах и вывод списка этих файлов
Часть кода батника :find cls echo Выберите папку echo. set /A count=0 FOR %%F IN (work/*.*)...

Поиск определенных значений в текстовых файлах и вывод имен файлов, содержащих эти значения
Доброе время суток знатокам. Задачка заключается в таком алгоритме : Есть родительский...

Вывод всех файлов и поддиректорий в заданной директории (добавить в код ввод директории)
.586p .model flat, stdcall std_output_handle equ -11 std_input_handle equ -10 extern...

4
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
19.06.2016, 17:35 2
Лучший ответ Сообщение было отмечено pav1uxa как решение

Решение

caesarnn,
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
function search($dir, &$words)
{
    $result = [];
    $files = array_slice(scandir($dir), 2);
    foreach ($files as $file)
    {
        $path = $dir.DIRECTORY_SEPARATOR.$file;
        if (is_file($path))
        {
            $content = file_get_contents($path);
            foreach ($words as $word)
            {
                $pos = strstr($content, $word);
                if ($pos !== FALSE)
                {
                    $result[$path][] = $word;
                }
            }
        }
        elseif(is_dir($path))
        {
            $result = array_merge($result, search($path, $words));
        }
    }
    return $result;
}
 
$dir = "test";
$words = ["php", "html"];
$a = search($dir, $words);
echo "<pre>".print_r($a, true);
Код
Array
(
    [test\blab\test.txt] => Array
        (
            [0] => php
            [1] => html
        )

    [test\index.php] => Array
        (
            [0] => php
        )

)
1
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
19.06.2016, 19:32  [ТС] 3
Так-с, уже нашёл более подходящее решение -найти все эти строки с помощью BASH скрипта.

Добавлено через 1 час 16 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
function search($dir, &$words)
{
    $result = [];
    $files = array_slice(scandir($dir), 2);
    foreach ($files as $file)
    {
        $path = $dir.DIRECTORY_SEPARATOR.$file;
        if (is_file($path))
        {
            $content = file_get_contents($path);
            foreach ($words as $word)
            {
                $pos = strstr($content, $word);
                if ($pos !== FALSE)
                {
                    $result[$path][] = $word;
                }
            }
        }
        elseif(is_dir($path))
        {
            $result = array_merge($result, search($path, $words));
        }
    }
    return $result;
}
 
$dir = dirname(__FILE__)
$words = ["base64", "REQUEST" , "GLOBALS" , "preg_replace" , "replace", "window.location"];
$a = search($dir, $words);
echo "<pre>".print_r($a, true);
?>
Подскажите пожалуйста, такой скрипт почему-то вызывает ошибку:
syntax error, unexpected '$words' (T_VARIABLE) in /opt/lampp/htdocs/web-antivirus/scan2.php on line 30

Добавлено через 1 минуту
Что изменил от рабочего варианта: заменил
PHP
1
$dir = "test";
на
PHP
1
$dir = dirname(__FILE__)
(чтобы искал в той директории, в которой находится).

Добавлено через 11 минут
Всё работает. Это я ошибся.

Добавлено через 10 секунд
Спасибо большое.
0
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
19.06.2016, 22:32  [ТС] 4
Теперь у меня во такой код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
function search($dir, &$words)
{
    $result = [];
    $files = array_slice(scandir($dir), 2);
    foreach ($files as $file)
    {
        $path = $dir.DIRECTORY_SEPARATOR.$file;
        if (is_file($path))
        {
            $content = file_get_contents($path);
            foreach ($words as $word)
            {
                $pos = strstr($content, $word);
                if ($pos !== FALSE)
                {
                    $result[$path][] = $word;
                }
            }
        }
        elseif(is_dir($path))
        {
            $result = array_merge($result, search($path, $words));
        }
    }
    return $result;
}
 
$dir = dirname(__FILE__);
$words = ["base64", "REQUEST" , "GLOBALS" , "preg_replace" , "replace", "window.location"];
$a = search($dir, $words);
 
$delete_symbols = array (" REQUEST", " preg_replace" , " base64" , " replace" , "GLOBALS", " window.location", "[0]", "[1]", "[2]", "[3]", "[4]", "[5]","(", ")","[","]","=>", "Array");
        $result_unformatted = "<pre>".print_r($a, true);
$result_formatted = str_replace ($delete_symbols, "", $result_unformatted);
echo $result_formatted;
 
?>
Вопрос: как из вывода убрать сам массив и квадратные скобки? Сейчас это сделано через str_replace, но выглядит не очень красиво - слишком много пустого пространства между строками (см. скриншот).
Миниатюры
Поиск вхождений в файлах директории и вывод файлов на экран  
0
57 / 57 / 18
Регистрация: 22.05.2015
Сообщений: 607
19.06.2016, 23:01  [ТС] 5
И ещё - можно ли "обернуть" каждую строку в HTML-тег (потом буду прописывать стили)?

Добавлено через 5 минут
И ещё - можно ли "научить" скрипт искать строки длиннее определённого кол-ва символов (пробелы тоже считаются) и тоже их выводить в том же массиве? Прочитал, что подсчёт кол-ва символов осуществляется с помощью
PHP
1
strlen ()
, но ума не приложу, как заставить скрипт "прочитывать" каждый файл.

Добавлено через 2 минуты
Кстати, как я понимаю, в данном коде пути к файлам хранятся в массиве ($result)?

Добавлено через 5 минут
И ещё одно - можно сделать некую кнопку, которая будет удалять файлы, пути к которым указаны в массиве?

Добавлено через 12 минут
(удаление с помощью unlink).
0
19.06.2016, 23:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2016, 23:01
Помогаю со студенческими работами здесь

Поиск определённого слова во всех имеющихся в заданной директории текстовых файлах
Подскажите плиз, как сделать поиск во всех имеющихся текстовых файлах определённого слова? На диске...

Вывод в файл информации о всех имеющихся в заданной директории исполняемых файлах
Всем привет. Имеется задание: Разработать пакетный файл для вывода информации в файл о всех...

Поиск указанных файлов на указанном диске и вывод результата на экран
Всем привет, я здесь впервые,и вот возник такой вопрос Для поиска файлов и выведения на экран я...

Поиск в текстовых файлах символьных групп по шаблону и последующий поиск найденных в именах файлов (с логом)
Господа программисты! Прошу помочь в таком вопросе! Исходные данные: Последовательности...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru