Вывод строк из нескольких файлов в цикле

usascha

Новичок
Вывод строк из нескольких файлов в цикле

У меня есть следующий код:

PHP:
chdir("../ibs");
$dir=opendir(".");
echo "Файлы:<br>";
while ($files=readdir($dir)) {
	echo "$files<br>";
	if (!$files=fopen($files, "r")) {
		echo "Невозможно открыть файлы";
	} else {
		$files1=fread($files, fseek($files, ftell($files)+71));
		echo $files1;
	}
		fclose($files);
}
Список файлов он выводит. А вот строку с 71 символа из каждого из них нет. Что я неправильно делаю? Только не отправляйте просто в поиск - там уже был и не нашел ответа. Если можно дайте решение или конкретную ссылку.
 

antiportal

Guest
Какое страшное...
(http://ru.php.net/manual/en/class.dir.php)
 

usascha

Новичок
Автор оригинала: antiportal
Какое страшное...
(http://ru.php.net/manual/en/class.dir.php)
прочитал, ничего не нашел для меня подходящего.

Net Dog

PHP:
+$files1=fread($files, 71);
Этот вариант выдает только один символ.


Кстати, параллельно вопрос: если в папке лежат разные файлы (php,doc, js class), то как сделать так чтобы открытие происходило только файлов с расширением php? В книге есть пример с одним файлом, а тут, наверно, нужен массив.
 

gromitus

Новичок
проверять - является ли файл файлом с расширением php - тебе дружок в строковые функции. Хотя есть функция [m]pathinfo[/m] - она подскажет extension файла - то бишь расширение
 

netdog

net @
+$files1=fread($files, 71);

Этот вариант выдает только один символ.
Что-то сегодня день мистики. У одного strtolower не работает когда должен работать, у тебя символ один выдаёт когда должен выдавать 71.

man: [m]fread[/m] читай про второй параметр.
 

antiportal

Guest
usascha
Хотел посоветовать dir (ну и glob) для улучшения читаемости кода ;-)
 

usascha

Новичок
За glob() большое спасибо.
Но я чего-то не понимаю, наверно. Не получается у меня вывести часть текста из файла: задача в получении списка файлов и вывода строки <title>заголовок файла</title> из каждого из файлов этого списка в столбик.
Вот измененный код:
PHP:
chdir("../ibs");
$dir=opendir("..");
echo "Файлы:<br>";
foreach (glob("ibs*.ph*") as $filename) {
	echo "$filename<br>";
	$filename=fread($filename, fseek($filename, ftell($filename)+71)); 
	echo $filename;
}
closedir($dir);
В итоге выскакивает ошибка:
Warning: fseek(): supplied argument is not a valid stream resource
и fread(), соответственно.
Что не так? Я уже разные аргументы к функциям перебрал. Не выходит; а список файлов выводится.
 

netdog

net @
%ЛЯ... Извините не выдержал.....

Ты хоть понимаешь чу ты суешь во второй аргумент fread?
ты посмотри что возвращает [m]fseek[/m]
Нафига тебе вообще сдался тут этот fseek.

ГОУ ЧИТАТЬ МАН

-~{}~ 03.11.04 02:56:

И куда делся твой fopen простите?

-~{}~ 03.11.04 02:59:

и попробуй скажи мне что у тебя выводится 1 символ: :mad: :D
PHP:
$dir = 'C:\\tmp\\';
chdir($dir);
foreach (glob("*.*") as $filename) {
	$fh = fopen($dir.$filename, 'r');
	$fc = fread($fh,71);
	fclose($fh);
	echo $filename.' : '.$fc."<br>\n";
}
 

usascha

Новичок
Спасибо за подсказку, Net Dog, но у меня Ваш код вообще ничего не выводит.
Если сделать var_dump($filename), то и она не показывает ничего!
Может проблема в настройках моего провайдера?
 

netdog

net @
Ну уж простите. Никто не будет тут разбираться какие там проблемы у твоего провайдера.


попробуй еще напиши полный путь в $dir, а не тот который ты там писал "../ibs".

p.s. в конце должен быть слешь.
 

usascha

Новичок
Это единственный вариант, который у меня выводит содержимое папки:
PHP:
chdir("../ibs");
$dir=opendir("..");
echo "ФАЙЛЫ:<br>";
foreach (glob("ibs*.ph*") as $filename) {
	echo "$filename<br>";
}
Как же сделать так, чтобы выбиралась строка <title>текст</title> из каждого из этих файлов и выводилась в столбик.

Это вообще возможно?
 

netdog

net @
Может проблема в настройках моего провайдера
проблема в днк.


мой код по сути ничем не отличается от твоего, путь только другой стоит.

Что значит не работает, ошибки вадаёт?
 

usascha

Новичок
в том-то и дело, что ничего не выдает.
имена файлов получаю, а пройтись по ним и выбрать нужную строку не могу.

с днк у меня все в порядке
 

netdog

net @
в твоем коде это лишнее:
PHP:
$dir=opendir("..");

а пройтись по ним и выбрать нужную строку не могу.
я сказал как еще в самом начале и показал даже. Попробуй сам поэкспирименть, а? А то только и слышно, памагите не работает, и делаешь снова то что тебе делать не стоит. Хотя правильные варианты я тебе кидал, маной в тебя кинули. Что ты еще хочешь? Чтобы пришел добрый дядя и настроил тебе всё?
А чтобы титл достать из файла, тебе надо + [m]preg_match_all[/m] и 71 байта для этого может быть мало, поэтому стоит _весь_ файл открывать.
 

usascha

Новичок
слышно только "помогите", потому что я не экспериментирую вслух. Все предложения я уже попробовал, да и своих было немало. И ссылки все прочел.
Вот про preg_match_all пока не знал, буду пробовать.

-~{}~ 09.11.04 03:32:

По правилам, вроде, надо написать что получлось, если получилось.
Я свою задачу решил. Вот как:
PHP:
chdir("../ibs");
$dir=opendir("..");
echo "Программы:<br>";
foreach (glob("ibs*.ph*") as $filename) {
$f=fopen($filename,"r"); 
    $data=fread($f, filesize($filename)); 
    fclose($f);
preg_match_all("/.*?<title.*?>(.*?)<\/title>/si",$data,$matches);

echo substr_replace($matches[1][0],"", 0,25)."<br>";
 

Gas

может по одной?
1. Лучше используй абсолютные пути в файловой системе.
2. foreach тебе спасибо не скажет когда [m]glob[/m] вернёт false
3. раз уж читаешь файл полностью, то есть ещё ф-ция [m]file_get_contents[/m]
4. судя по коду [m]preg_match_all[/m] тебе не надо, [m]preg_match[/m] хватит
5. выкинь substr_replace, используй просто [m]substr[/m].
 

usascha

Новичок
1. Почему-то абсолютные пути не работают. Наверно надо к хостеру обратиться.

2. я уже думал об этом, но пока другой вариант не нашел.

3. эту функцию попробую. Она чем-то лучше?

4. preg_match останавливается , когда находит совпадение. Мне же нужно найти все совпадения: "ibs*.ph*" - это несколко файлов (Я еще использую наименование файлов по шаблону для удобства).

5. этот пункт применил полностью.

Спасибо за подсказки.

Возник еще вопрос: функция sort() (с вариациями) не сортирует массив $matches. Почему не пойму.
 

Gas

может по одной?
1. Почему-то абсолютные пути не работают. Наверно надо к хостеру обратиться.
Создай и выполни файл
PHP:
<?php

  echo htmlspecialchars(file_get_contents(__FILE__));

?>
В броузере что-то показывается?
2. я уже думал об этом, но пока другой вариант не нашел.
Не приходило в голову что нужно результат [m]glob[/m] сохранить в переменную, а потом проверить массив там или нет. Если массив то foreach иначе в сад.

3. эту функцию попробую. Она чем-то лучше?
тем что при написании её ты сделаешь меньше ошибок, чем fopen и иже с ними.

4. preg_match останавливается , когда находит совпадение. Мне же нужно найти все совпадения: "ibs*.ph*" - это несколко файлов (Я еще использую наименование файлов по шаблону для удобства).
Кажется ты вообще не понимаешь что делает твоя программа.
preg_match с количеством файлов тут вообще ничего общего не имеет. Если у тебя может быть несколько блоков <title> в файле, то в рег нужно добавить модификатор U

5. этот пункт применил полностью.
замечательно :)


Возник еще вопрос: функция sort() (с вариациями) не сортирует массив $matches. Почему не пойму.
Что ты хочешь получить в результате сортировки? Только не говори что "отсортированый массив" :)
 
Сверху