PHP, как получить все файлы (только HTML-файлы) во всех подкаталогах и индексировать каждую HTML-страницу - PullRequest
1 голос
/ 27 июня 2011

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

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

<code>$file = '.html';
$index = indexer($file);
echo '<pre>'.print_r($index,true).'
';индексатор функций ($ 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 как $ 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. Любая помощь будет оценена, спасибо!

Ответы [ 5 ]

2 голосов
/ 27 июня 2011

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

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

  • Подсчитывать все строки всех файлов htm и html в текущем каталоге.
  • Добавить эти числа вверх,и затем добавьте их в глобальную переменную вне функции (просто используйте global, вы можете вернуть количество строк на каждый вызов и сложить их, но это неприятно)
  • вызовите эту функцию сновадля каждой папки в текущем каталоге (просто перебрать их в цикле)
  • как только вы вернетесь к самому началу, сбросьте глобальную переменную и верните ее значение
1 голос
/ 27 июня 2011

Вот альтернативный вариант использования 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. Он будет содержать как путь, так и размер.

1 голос
/ 27 июня 2011

Попробуйте использовать функцию 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;
}

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

1 голос
/ 27 июня 2011

RecursiveDirectoryIterator - лучший класс в PHP для этого. Это гибкий и быстрый.

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

0 голосов
/ 27 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...