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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Поиск и вывод картинок

Сообщения:  [1-10]    [11-20]  [21-23] 

 
 автор: cheops   (23.01.2005 в 15:24)   письмо автору
 
   для: SS   (23.01.2005 в 15:11)
 

Так как тема уже длинная, обсуждать не удобно - давайте в другую перейдём

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1701

   
 
 автор: SS   (23.01.2005 в 15:11)   письмо автору
 
   для: cheops   (23.01.2005 в 02:20)
 

Да, совсем забыл!
Бывает и больше двух фотографий на одной html-странице.
Максимум - 5-6.
Что надо для этого дописать?

   
 
 автор: SS   (23.01.2005 в 15:06)   письмо автору
 
   для: cheops   (23.01.2005 в 14:15)
 

http://ancientrome.ru/art/artwork/sculp/search.htm

Сканирование работает хорошо, только так же пишет все файлы подряд.

Поиск - тоже все хорошо, кроме того, что добавляет к IMG SRC имя htm-файла (например,
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/livia/liv001.htmliv001-0.jpg
ВМЕСТО
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/livia/liv001-0.jpg)

   
 
 автор: cheops   (23.01.2005 в 14:15)   письмо автору
 
   для: SS   (23.01.2005 в 03:34)
 

Рекурсивное сканирование с корня виртуального хоста
<?php
  
// Считаем число строк в файле url.txt
  
$arr = array();
  
$url_text = array();
  
$arr file("url.txt");
  
// Помещаем индексы файла url.txt в новый массив
  
foreach($arr as $line)
  {
    list(
$temp) = explode(" "$line);
    
$url_text[] = $temp;
  }
  
// Выясняем максимальный индекс
  
if(!empty($url_text)) $i max($url_text) + 1;
  else 
$i 0;
  
// Открываем файл url.txt на запись
  
$fd fopen("url.txt","a");
  
// Открываем файл base.txt на запись
  
$fb fopen("base.txt","a");
  
// Начинаем спуск по дереву католов
  
scan_dir(".",$fd,$fb);
  
// Закрываем файл url.txt
  
fclose($fd);
  
// Закрываем файл base.txt
  
fclose($fb);
  
//////////////////////////////////////////////////////////
  // Рекурсивная функция - спускаемся вниз по Исскуству :)))
  //////////////////////////////////////////////////////////
  
function scan_dir($dirname,$fd,$fb)
  {
    
// Объявляем индекс $i глобальным, чтобы
    // его значение сохранялось после выхода
    // из функции
    
GLOBAL $i;
    
// Открываем текущую директорию
    
$dir opendir($dirname);
    
// Читаем в цикле директорию
    
while (($file readdir($dir)) !== false)
    {
      
// Если файл обрабатываем его содержимое
      
if($file != "." && $file != "..")
      {
        
// Если имеем дело с файлом - регистрируем его
        
if(is_file($dirname."/".$file))
        {
          
// Записываем имя файла в url.txt
          
fwrite($fd"$i $dirname/".$file."/\n");
          
// Получаем содержимое файла
          
$buffer file_get_contents($dirname."/".$file);
          
// Извлекаем пути к фотографиям
          
$patern "|<img[\s]*alt[^\"]*\"([^\"]*)\"[\s]*src[^\"]*\"([^\"]*)|i";
          
preg_match_all($patern$buffer$outPREG_SET_ORDER);
          if(isset(
$out[0]))
          {
            
$out[0][1] = str_replace("\r\n","",$out[0][1]);
            
$out[0][1] = str_replace("\n","",$out[0][1]);
            
fwrite($fb,"$i ".$out[0][2]." ".$out[0][1]."\n");
          }
          if(isset(
$out[1]))
          {
            
$out[1][1] = str_replace("\r\n","",$out[1][1]);
            
$out[1][1] = str_replace("\n","",$out[1][1]);
            
fwrite($fb,"$i ".$out[1][2]." ".$out[1][1]."\n");
          }
          
$i++;
        }
        
// Если перед нами директория, вызываем рекурсивно
        // функцию scan_dir
        
if(is_dir($dirname."/".$file))
        {
          
scan_dir($dirname."/".$file,$fd,$fb);
        }
      }
    }
    
// Закрываем директорию
    
closedir($dir);
  }
?>

Поиск (уточните пожалуйста где у вас изображения храняться - в той же директории? Этот скрипт расчитан на это предположение)
<?php 
Error_Reporting
(E_ALL & ~E_NOTICE); 
// Имя файла с путями к фотографиям и ключевыми словами 
$filename "base.txt"
$filurl "url.txt"
// Помещаем содержимое файла в массив $photo_line 
$photo_line file($filename); 
// Проверяем то, что передано в форме 
// дабы исключить взлом 
$_GET['name'] = str_replace("."," ",$_GET[name]); 
$_GET['name'] = str_replace("'"," ",$_GET[name]); 
$_GET['name'] = str_replace('"'," ",$_GET[name]); 
if(empty(
$_GET['name'])) 

  exit (
"Текстовое поле осталось не заполненным - введите слово для поиска"); 

// Открываем файл url.txt c реальными путями к фотографии 
$url_temp file($filurl); 
foreach(
$url_temp as $line)
{
  list(
$index,$value) = explode(" ",$line);
  
$url[$index] = $value;
}
// В цикле ищем вхождения 
foreach($photo_line as $lines

  
// Проверяем входит ли в состав строки искомое 
  // слово - если входит - запоминаем его номер. 
  
if(preg_match("|".$_GET['name']."|i"$lines)) 
  { 
    
$temp substr($lines,strpos($lines," ")); 
    
$temp trim($temp); 
    
$path substr($temp,0,strpos($temp," ")); 
    
$alt substr($temp,strpos($temp," ")); 
    
$photo_path[] = trim($url[substr($lines,0,strpos($lines," "))]).$path."|".$alt
  } 

// Выводим фотографии 
foreach($photo_path as $pathpd

  
// Отделяем описание от пути к файлу
  
list($pathp,$alt) = explode("|",$pathpd);
  
// Теперь разбиваем строку на директорию и файл 
  
$arr pathinfo($pathp); 
  
// Ссылка на исходную HTML-страницу 
  
echo "<a href=$arr[dirname]><IMG src=".$arr[dirname].$arr[basename]." width=779 height=106 border=0></a><br>"
  
// Описание, с выделением жирным найденных слов
  
echo str_replace($_GET['name'],"<b>$_GET[name]</b>",$alt)."<br>";
  unset(
$arr); 

?>

   
 
 автор: cheops   (23.01.2005 в 13:23)   письмо автору
 
   для: SS   (23.01.2005 в 03:34)
 

1) Хорошо сейчас постараюсь быстренько в рекурсию загнать этот скрипт.
a) В общем это не влияет, так как мы просто не используем эти номера, но можно убрать.
б) Пожалуй что да, нужно передлать (в таком формате запись можно удалить, но нужно оставлять пустую строку.)

   
 
 автор: SS   (23.01.2005 в 03:34)   письмо автору
 
   для: cheops   (23.01.2005 в 02:45)
 

Все, работает! Спасибо огромное!
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/search7.htm

1. Как просканировать вглубь более одной папки? У нас в разделе ИСКУССТВО более 200 папок на 5-7 уровней.

Файл URL.TXT -

а) пишет все файлы подряд, какие только есть в папке. Нам ведь нужны только htm?

б) может быть, сделать так, чтобы у файлов URL и BASE были одинаковые номера (по образцу BASE), а то получается очень жесткая привязка номера строки URL.TXT к присвоенному ей соотвествующему номеру BASE.TXT. Удалить какую-то запись получается практически невозможно, - сразу же все поехало.

   
 
 автор: cheops   (23.01.2005 в 02:45)   письмо автору
 
   для: SS   (23.01.2005 в 02:32)
 

Посмотрите, вот этот обработчик поисковой формы:
<?php 
Error_Reporting
(E_ALL & ~E_NOTICE); 
// Имя файла с путями к фотографиям и ключевыми словами 
$filename "base.txt"
$filurl "url.txt"
// Помещаем содержимое файла в массив $photo_line 
$photo_line file($filename); 
// Проверяем то, что передано в форме 
// дабы исключить взлом 
$_GET['name'] = str_replace("."," ",$_GET[name]); 
$_GET['name'] = str_replace("'"," ",$_GET[name]); 
$_GET['name'] = str_replace('"'," ",$_GET[name]); 
if(empty(
$_GET['name'])) 

  exit (
"Текстовое поле осталось не заполненным - введите слово для поиска"); 

// Открываем файл url.txt c реальными путями к фотографии 
$url file($filurl); 
// В цикле ищем вхождения 
foreach($photo_line as $lines

  
// Проверяем входит ли в состав строки искомое 
  // слово - если входит - запоминаем его номер. 
  
if(preg_match("|".$_GET['name']."|i"$lines)) 
  { 
    
$temp substr($lines,strpos($lines," ")); 
    
$temp trim($temp); 
    
$path substr($temp,0,strpos($temp," ")); 
    
$alt substr($temp,strpos($temp," ")); 
    
$photo_path[] = trim($url[substr($lines,0,strpos($lines," "))]).$path."|".$alt
  } 

// Выводим фотографии 
foreach($photo_path as $pathpd

  
// Отделяем описание от пути к файлу
  
list($pathp,$alt) = explode("|",$pathpd);
  
// Теперь разбиваем строку на директорию и файл 
  
$arr pathinfo($pathp); 
  
// Ссылка на исходную HTML-страницу 
  
echo "<a href=$arr[dirname]><IMG src=$arr[basename] width=779 height=106 border=0></a><br>"
  
// Описание, с выделением жирным найденных слов
  
echo str_replace($_GET['name'],"<b>$_GET[name]</b>",$alt)."<br>";
  unset(
$arr); 

?>

   
 
 автор: SS   (23.01.2005 в 02:32)   письмо автору
 
   для: cheops   (23.01.2005 в 02:20)
 

Да, конечно выводить. И если можно, выделить найденный текст жирным.

   
 
 автор: cheops   (23.01.2005 в 02:20)   письмо автору
 
   для: SS   (22.01.2005 в 17:35)
 

Дайвайте со скана директорий начнём. Поздненько я до вас добрался :)))
<?php
  
// Считаем число строк в файле url.txt
  
$arr = array();
  
$arr file("url.txt");
  
$i count($arr);
  
// Открываем файл url.txt на запись
  
$fd fopen("url.txt","a");
  
// Открываем файл base.txt на запись
  
$fb fopen("base.txt","a");
  
// Открываем текущую директорию
  
$dir opendir(".");
  
// Читаем в цикле директорию
  
while (($file readdir($dir)) !== false)
  {
     
// Если файл обрабатываем его содержимое
     
if($file != "." && $file != "..")
     {
       if(
is_file($file))
       {
         
// Записываем имя файла в url.txt
         
fwrite($fd$file."/\n");
         
// Получаем содержимое файла
         
$buffer file_get_contents($file);
         
// Извлекаем пути к фотографиям
         
$patern "|<img[\s]*alt[^\"]*\"([^\"]*)\"[\s]*src[^\"]*\"([^\"]*)|i";
         
preg_match_all($patern$buffer$outPREG_SET_ORDER);
         if(isset(
$out[0]))
         {
           
$out[0][1] = str_replace("\r\n","",$out[0][1]);
           
$out[0][1] = str_replace("\n","",$out[0][1]);
           
fwrite($fb,"$i ".$out[0][2]." ".$out[0][1]."\n");
         }
         if(isset(
$out[1]))
         {
           
$out[1][1] = str_replace("\r\n","",$out[1][1]);
           
$out[1][1] = str_replace("\n","",$out[1][1]);
           
fwrite($fb,"$i ".$out[1][2]." ".$out[1][1]."\n");
         }
         
$i++;
       }
     }
  }
  
// Закрываем директорию
  
closedir($dir);
  
// Закрываем файл url.txt
  
fclose($fd);
  
// Закрываем файл base.txt
  
fclose($fb);
?>

Так файлы url.txt и base.txt могут иметь записи до сканирования, но каждый из них должен имть в конце пустую строку. Скрипт сканирует текущую директорию и дополняет файлы base.txt и url.txt. Я так как понял в HTML-файлах больше двух фотографий не бывает? Поэтому случаи больше 2-х фотографий не обработаны. Осторожно повтороное сканирование добавит файлы второй раз.
3) Так а с третьим чего у нас: выводить то, что в alt-параметре тэга img?

   
 
 автор: cheops   (22.01.2005 в 17:38)   письмо автору
 
   для: SS   (22.01.2005 в 17:35)
 

Что-то просмотрел ваш ответ и он отметился у меня как прочитанный :))) сегодя ближе к ночи постараюсь отписаться...

   

Сообщения:  [1-10]    [11-20]  [21-23] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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