Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: скрипт вывода новостей
 
 автор: Максим Медведев   (22.01.2007 в 12:20)   письмо автору
 
 

Добрый день помогите разобраться с такой проблемой. Есть следующий скрипт:

<?php

 $dir 
opendir (".");

  while (
$file readdir ($dir)) 
  {
   if(!
is_dir($file)) { 
   
   
$content file_get_contents("$file");

  
// Регулярное выражение
  
$pattern "|<i>(.*)</i>|siU";
 
  if(
preg_match($pattern$content$out))
  {

   echo 
"$out[1] <a href=\"$file\">перейти</a><br><br>";

   }
  }
}
  
closedir ($dir);

?>

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

   
 
 автор: cheops   (22.01.2007 в 12:56)   письмо автору
 
   для: Максим Медведев   (22.01.2007 в 12:20)
 

Имена файлов в каком формате?

   
 
 автор: Максим Медведев   (22.01.2007 в 14:14)   письмо автору
 
   для: cheops   (22.01.2007 в 12:56)
 

Имена файлов имеют следующий вид:
01012006.php
02122006.php
и так далее. То есть названия файло совпадают с датой их создания.

   
 
 автор: cheops   (23.01.2007 в 00:39)   письмо автору
 
   для: Максим Медведев   (22.01.2007 в 12:20)
 

1) Вместо ksort используйте rsort().
2) Вы можете узнать имя текущего скрипта при помощи элемента $_SERVER['PHP_SELF'] или новости у вас включаются при помощи конструкции include?

   
 
 автор: Максим Медведев   (23.01.2007 в 13:30)   письмо автору
 
   для: cheops   (23.01.2007 в 00:39)
 

1) не помогло, выдаёт такую ошибку:
Warning: rsort() expects parameter 1 to be array, string given ...
2) попробовал записать так:

if ($file = $_SERVER['PHP_SELF']) continue; 

прекращает работать. тоесть ошибка в записи?
3) это и есть файл новостей с верху и снизу идёт оформление страницы, а ссылку на сябя он даёт в таком виде (.*) перейти

   
 
 автор: cheops   (23.01.2007 в 15:36)   письмо автору
 
   для: Максим Медведев   (23.01.2007 в 13:30)
 

1) Так а вы зачем строку передаёте rsort()? Нужно передавать ему массив.
2) Сначала выведите значение $_SERVER['PHP_SELF'] в окно браузера - посмотрите в каком формате выводится у вас путь к файлу.

   
 
 автор: Максим Медведев   (24.01.2007 в 17:44)   письмо автору
 
   для: cheops   (23.01.2007 в 15:36)
 

значение $_SERVER['PHP_SELF'] получается равным полному адресу до скрипта

   
 
 автор: Trianon   (23.01.2007 в 16:03)   письмо автору
 
   для: cheops   (23.01.2007 в 00:39)
 

Формат даты ддммгггг не позволит нормально сортировать такие строки.
rsort будет мало. Придется usort применять.

   
 
 автор: euginewm   (23.01.2007 в 13:55)   письмо автору
 
   для: Максим Медведев   (22.01.2007 в 12:20)
 

Скрипт собирает в массив имена фйлов в текущей директории кроме "..", ".", файла-скрипта
Вот рабочий код:


<?php

$dir 
".";
if (
is_dir($dir)) {
    if (
$dh opendir($dir)) {
        while ((
$file readdir($dh)) !== false) {
            if ( (
$file != ".") && ($file != "..") && ($file != $_SERVER['PHP_SELF']) )
            {
                
$array[] = preg_replace("/\.(\w)+/"""basename($file))." <a href='$file'>перейти</a><br />";
            }
        }
        
closedir($dh);
    }
}

rsort($array);

foreach(
$array as $vals)
{
    echo 
$vals;
}

?>


В вашем коде сдесь:

if ($file = $_SERVER['PHP_SELF']) continue; 


Идет сначала присвоение, затем проверка, т.о. результат всегда положительный, а оператор continue заставляет прервать работу данной итерции.

   
 
 автор: Максим Медведев   (23.01.2007 в 15:52)   письмо автору
 
   для: euginewm   (23.01.2007 в 13:55)
 

спасибо, только он возвращает ссылку на себя и список всех папок в каталоге

   
 
 автор: Максим Медведев   (24.01.2007 в 10:23)   письмо автору
 
   для: Максим Медведев   (23.01.2007 в 15:52)
 

Сегодня переписал этот скрипт получил следующее:

<?php 

$dir 
opendir ("."); 

  while ((
$file readdir ($dir))  !== false)
  { 
   if(!
is_dir($file)) {  

   
$content file_get_contents("$file"); 

  
// Регулярное выражение 
  
$pattern "|<i>(.*)</i>|siU"
  
  if(
preg_match($pattern$content$out)) 
  { 

   if ( (
$file != ".") && ($file != "..") && ($file != $_SERVER['PHP_SELF'])) 
             {
                
$array[0] = preg_replace("/\.(\w)+/"""$out[1])." <a href='$file'>перейти</a><br />"
            } 
        
 
rsort($array);

foreach(
$array as $vals

    echo 
$vals
}


   } 
  } 


closedir ($dir);
?>

Результат такой, какой был получен мной первоначально. почему то он всё равно выводит ссылку на самого себя. сортировка не получается, если писать не $array[0], то выводится сначало одна новость, потом две, три и так далее.

   
 
 автор: bronenos   (24.01.2007 в 20:23)   письмо автору
 
   для: Максим Медведев   (24.01.2007 в 10:23)
 

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

   
 
 автор: bronenos   (24.01.2007 в 20:48)   письмо автору
 
   для: Максим Медведев   (24.01.2007 в 10:23)
 

Попробуем...
Формат даты нужен ддммгггг

<?php
$dir 
opendir ('.');
while (
$fille readir($dir)) !== false) {
 if (
preg_match ('#([0-9]{1,2})([0-9]{2})([0-9]{4})\.php#is'$file$name)) 
  
$content file_get_contents ($name[0]);
  
preg_match ('#<t>(.*!)<\/i>#is'$content$info);

  
$date $name[3].$name[2].$name[1];
  
$files[$date]['name'] = $name[0];
  
$files[$date]['title'] = $info[1];
 }
}

$files resort ($files);
foreach 
$files ar $f)
 print 
"<a href='{$f[name]}'>{$f[title]}</a><br />";
?>

   
 
 автор: bronenos   (24.01.2007 в 21:35)   письмо автору
 
   для: Максим Медведев   (24.01.2007 в 10:23)
 

Скажите хоть, работает ли.. а то интересно =)

   
 
 автор: Максим Медведев   (26.01.2007 в 13:30)   письмо автору
 
   для: bronenos   (24.01.2007 в 21:35)
 

К сожалению нет. скрипт выдаёт следующие kib,rb^
Notice: Use of undefined constant name - assumed 'name' in
Notice: Use of undefined constant title - assumed 'title
Notice: Undefined offset: 1 in
Warning: file_get_contents(9122006.php) [function.file-get-contents]: failed to open stream: No such file or directory in
и так далее. судя по всему количество этих ошибок равно числу файлов в каталоге. поэтому на один файл аваодится судя по всему до пяти ошибок.

   
 
 автор: bronenos   (26.01.2007 в 14:43)   письмо автору
 
   для: Максим Медведев   (26.01.2007 в 13:30)
 

Немного изменил

   
 
 автор: Максим Медведев   (27.01.2007 в 11:01)   письмо автору
 
   для: bronenos   (26.01.2007 в 14:43)
 

так в том то и дело, что мой вариант всё выводит и без ошибок, вот сортировка и эта ссылка ....

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования