Nano Hash - криптовалюты, майнинг, программирование

PHP, как получить все файлы (только html-файлы) во всех подкаталогах и индексировать каждую html-страницу

В качестве домашнего задания мне нужно получить все файлы .htm и .html в текущем и всех подкаталогах, а также проиндексировать их, подсчитав все слова, встречающиеся в файлах по отдельности.

Вот как я буду считать файл, когда найду html-файл в каталоге:

$file = '.html';
$index = indexer($file);
echo '<pre>'.print_r($index,true).'</pre>';

function indexer($file) {
    $index = array();
    $find = array('/\r/','/\n/','/\t/','!',',','.','"',';',                           ':');
    $replace = array(' ',' ',' ',' ',' ',' ',' ',' ',' ');
    $string = file_get_contents($file);
    $string = strip_tags($string);
    $string = strtolower($string);
    $string = str_replace($find, $replace, $string);
    $string = trim($string);
    $string = explode(' ', $string);
    natcasesort($string);
    $i = 0;
    foreach($string as $word) {
        $word = trim($word);
        $ignore = preg_match('/[^a-zA-Z]/', $word);
        if($ignore == 1) {
            $word = '';
        }
        if( (!empty($word)) && ($word != '') ) {
            if(!isset($index[$i]['word'])) {
                $index[$i]['word'] = $word;
                $index[$i]['count'] = 1;
            } elseif( $index[$i]['word'] == $word ) {
                $index[$i]['count'] += 1;
            } else {
                $i++;
                $index[$i]['word'] = $word;
                $index[$i]['count'] = 1;
            }
        }
    }
    unset($work);
    return($index);
}

Мне просто нужно сначала выяснить, как найти все файлы htm или html в каталогах, а затем начать использовать приведенный выше код для каждого файла htm/html. Любая помощь будет оценена, спасибо!

27.06.2011


Ответы:


1

Ну, поскольку это домашнее задание, я не буду давать вам код. Но я могу указать вам правильное направление. Обычно для такого рода вещей люди используют рекурсивную функцию. Где функция вызывает сама себя.

Эта функция должна делать следующее:

  • Подсчитайте все строки всех файлов htm и html в текущем каталоге.
  • Сложите эти числа, а затем добавьте их в глобальную переменную вне функции (просто используйте глобальную, вы можете вернуть количество строк для каждого вызова и добавить их, но это боль в заднице)
  • вызовите эту функцию снова для каждой папки в текущем каталоге (просто прокрутите их)
  • как только вы вернетесь в самое начало, сбросьте глобальную переменную и верните ее значение
27.06.2011
  • Кажется, я не знаю, как реализовать рекурсивную функцию и реализовать приведенный выше код для каждого файла htm/html, хранящегося в массиве. Я довольно новичок в PHP и кодировании в целом. 27.06.2011

  • 2

    Класс RecursiveDirectoryIterator лучше всего подходит для этого. Это гибко и быстро.

    Другие альтернативные методы (не рекурсивные) описаны в разделе "Переход к массиву с помощью PHP". В своем ответе на этот вопрос я рассчитал время для различных методов, данных другими ответами, но все решения в коде PHP работают медленнее, чем с использованием классов PHP SPL.

    27.06.2011

    3

    Вот альтернатива с использованием RecursiveIteratorIterator, RecursiveDirectoryIterator и pathinfo().

    <?php
    
    $dir = '/';
    
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::CHILD_FIRST);
    
    foreach ( $iterator as $path )
      if ( $path->isFile() && preg_match('/^html?$/i', pathinfo($path->getFilename(), PATHINFO_EXTENSION)) )
        echo $path->getPathname() . PHP_EOL;
    

    Если вам нужно получить текущий рабочий каталог, вы можете использовать getcwd() ( т.е. $dir = getcwd();).

    Чтобы получить длину контента, вы можете сделать несколько вещей. Вы можете получить содержимое файла с помощью file_get_contents и использовать strlen для вычисления длины или str_word_count для подсчета слов. Другим вариантом может быть использование $path->getSize().

    Если вы используете массив для хранения имен и размеров, вы можете использовать пользовательскую функцию и uasort для сортировки массива по размерам.

    Более полный пример:

    <?php
    
    function sort_by_size($a, $b)
    {
      if ( $a['size'] == $b['size'] )
        return 0;
    
      return ( $a['size'] < $b['size'] ? -1 : 1 );
    }
    
    $dir = '/';
    $files = array();
    
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::CHILD_FIRST);
    
    foreach ( $iterator as $path )
      if ( $path->isFile() && preg_match('/^html?$/i', pathinfo($path->getFilename(), PATHINFO_EXTENSION)) )
        $files[] = array(
          'name' => $path->getPathname(),
          'size' => $path->getSize()
        );
    
    uasort($files, sort_by_size);
    

    Затем массив $files можно пройти по циклу с помощью цикла foreach. Он будет содержать как путь, так и размер.

    27.06.2011
  • (совет) Также есть GlobIterator, RegexIterator и FilterIterator 27.06.2011

  • 4

    Попробуйте использовать функцию glob.

    $files = glob('*.htm*');
    foreach($files as $file) {
    //code here
    }
    

    Отредактировано:

        function readDir($path) {
      $files = glob($path . '*.*');
    
      foreach ($files as $file) {
        if (is_dir($file)) {
          $html_files = array_merge((array) readDir($file . '/'), (array) $html_files);
        }
    
        if (in_array(strtolower(end(explode('.', $file))), array('html', 'htm'))) {
          $html_files[] = $file;
        }
      }
    
      return $html_files;
    }
    

    Только что отредактировал ответ, попробуйте это. (Примечание: я не тестировал код ни на одном сайте.) Спасибо.

    27.06.2011
  • Это не будет работать рекурсивно. Вопрос задает текущий каталог и все подкаталоги. 27.06.2011
  • Мне нужно сначала выполнить поиск в текущем и подкаталогах всех файлов .htm, а затем вставить код выше. Какой код/функцию я должен использовать для этого? 27.06.2011

  • 5

    Есть ли у вас какие-либо ограничения на функции/классы, которые вы можете использовать? Если нет, то проверьте RecursiveDirectoryIterator, это позволит вам пройти через каталоги, рекурсивно перебирая все элементы каталога. Затем вы можете сопоставить расширение для каждого элемента, и если оно совпадает, в основном, сделайте свой подсчет.

    Альтернативным подходом к этому может быть использование glob при переборе каталогов. который позволяет вам выполнять *.html поиск, как если бы вы использовали утилиту *nix find.

    Что касается подсчета, вы можете взглянуть на str_word_count.

    27.06.2011
  • Я позаботился о счетной части, но я не уверен, как зациклить приведенный выше код или даже найти все файлы htm/html в текущем и подкаталогах и сохранить их в массиве. 27.06.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..