|
|
|
| Здравствуйте.
Помогите, пожалуйста, с поиском по картинкам. Меня интересует следующее.
Поиск картинки по подписи к картинке <img alt>.
Поиск точной фразы или совпадение с любой частью слова.
Вывод найденных картинок в виде превьюшек, если можно, то тех, которые уже существуют (они находятся в той же директории, что и большая картинка, но у нее после названия добавляется -0, например, у картинки ani001.jpg превьюшка ani001-0.jpg). Или, если так нельзя, - чтобы размеры были не больше, чем 90х90.
Вывод в виде таблицы примерно такого плана: http://ancientrome.ru/art/liter/rsp/search.htm. Найденное слово выделить жирным.
С уважением, Сосновский Сергей | |
|
|
|
|
|
|
|
для: SS
(19.01.2005 в 04:50)
| | Про создание уменьшенных изображений можно почитать в теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=145, про поиск в тэге <img alt> можно почитать http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=981
PS Если что-то не заладится - пишите. | |
|
|
|
|
|
|
|
для: cheops
(19.01.2005 в 12:45)
| | Конечно не заладилось :)
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/search.php
Для начала тогда хотелось бы найти в директории http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/ файлы, содержащие в ALT слово "Август". Известно, что их там 74 + 1 <META NAME="ROBOTS" CONTENT="NOINDEX">, если это принимается во внимание.
Подскажите, что не так там. | |
|
|
|
|
|
|
|
для: cheops
(19.01.2005 в 12:45)
| | Так, покопался с вариантом base.txt - все работает замечательно!
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/search2.htm
ВОПРОСЫ:
1. Как там дописать, чтобы в случае, если ничего не нашло, то выводило об этом сообщение (сейчас выдает ошибку:
Warning: Invalid argument supplied for foreach() in /home/ancientrome/html/art/artwork/sculp/rom/imp/augustus/search2.php on line 28)
2. Как автоматизировать процесс создания BASE.TXT - т.е., чтобы скрипт прошелся по директориям всех уровней и создал из IMG ALT файл BASE.TXT с данными? Требуется имя файла и путь к нему из той директории, откуда запущен скрипт + полностью ALT. Конечно, хотелось бы при этом какой-то структуры создаваемого файла для визуального просмотра.
3. Возможность вывода текста IMG ALT напротив картинки.
4. Возможность попасть с найденной картинки на html-файл, ее содержащий.
5. Сообщение, сколько всего найдено файлов по запросу.
6. Нумерация файлов по порядку. | |
|
|
|
|
|
|
|
для: SS
(19.01.2005 в 18:40)
| | 1. После первого цикла foreach следует организовать проверку массива $photo_path
<?php
if(!isset($photo_path))
{
exit("К сожалению, ничего не найдено, попробуйте другое ключевое слово");
}
?>
|
2-3. Это можно... но нужен файлик для примера.
4. Это нужно в усложнять структуру base.txt и прописывать адрес напротив картинки...
5. Это осуществляется при помощи кода
<?php
echo "Найдено - ".count($photo_path)." файлов";
?>
|
6. Хм... ну можно добавить нумерованный список средствами HTML:
<?php
// Выводим фотографии
echo "<ol>";
foreach($photo_path as $pathp)
{
echo "<li><IMG src=$pathp width=779 height=106 border=0><br>";
}
echo "</ol>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(19.01.2005 в 22:49)
| | Теперь перебираемся для обкатки поиска сюда:
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/search3.htm
1) Работает. СПАСИБО!
5) Работает только в конце страницы; в начале страницы, где, по идее, сообщению о количестве найденных совпадений самое место, не работает, показывает кол-во = 0
6) В нашем случае используем таблицу из двух колонок и по строке на каждую найденную картинку. В таблице <li> не работает! Таблица же используется для более удобного представления найденных результатов (т.е., в левой колонке - превьюшки, в правой - текст). | |
|
|
|
|
|
|
|
для: SS
(20.01.2005 в 00:36)
| | 5-6) А вы делайте следующим образом:
<?php
foreach($photo_line as $lines)
{
// Проверяем входит ли в состав строки искомое
// слово - если входит - запоминаем его номер.
if(preg_match("|".$_GET['name']."|i", $lines))
{
$path = substr($lines,0,strpos($lines," "));
$photo_path[] = $path;
}
}
// Число фотографий
$count = count($photo_path);
// А вот тут начинайте формировать страницу
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Результаты поиска</title>
... ты-ры пы-ры пасатижи...
<?php
$i = 0;
// Выводим фотографии
foreach($photo_path as $pathp)
{
$i++;
echo "$i <IMG src=$pathp width=779 height=106 border=0><br>";
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(20.01.2005 в 00:51)
| | Отлично, все работает, СПАСИБО!
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/search4.htm (border - оставлено для наглядности) | |
|
|
|
|
|
|
|
для: cheops
(19.01.2005 в 22:49)
| | 2) Автоматизация создания BASE.TXT
Допустим, скрипт нужно запустить из директории http://ancientrome.ru/art/artwork/ вглубь на все подпапки (5-7, не важно сколько, уровней).
По каждой, соотвественно, найденной картинке, создать запись:
а) относительный адрес картинки;
б) относительный адрес страницы с этой картинкой;
в) содержание подписи к картинке;
ну и остается возможность добавить ручками ключевые слова от себя, если угодно.
Есть только один момент - как быть при переиндексации? надо думать, ручная работа полетит... Тем не менее, это уже дело пятое. Главная задача - обработать весь массив информации. Ну а там, если кому-то хочется, можно разделить BASE-файлы по тематикам - на каждый корневой каталог по базе - если, разумеется, такая структура предусмотрена при создании сайта.
3) Пожалуйста, файлик для примера:
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/base.txt
(информацию о названии файла, разумеется, отбросить).
4)
>4. Это нужно в усложнять структуру base.txt и прописывать
>адрес напротив картинки...
Давайте усложним. Оно того стоит! Если не попасть на страницу с поиска - то для чего тогда вообще поиск? | |
|
|
|
|
|
|
|
для: SS
(20.01.2005 в 01:08)
| | Знаете, я сейчас, отправляюсь спать так как, завтра рано вставать и весь день бегать... доберусь до вашей задачи наверное поздно... если я забуду, про неё поднимите пожалуйста тему. | |
|
|
|
|
|
|
|
для: SS
(20.01.2005 в 01:08)
| | 2) Здесь требует пример HTML-страницы, т.е. то, что подлежит разбору.
3-4) Следует добавить файл url.txt в котором будут перечислены адреса страниц, на которые в каждой строчке содержит по одному адресу, обязательно заканчивающегося прямым слешем, в не зависимости от того, директория это или файл
http://www.softtime.ru/forum/index.php/
http://www.softtime.ru/hret.html/
http://www.sotttime.ru/dic/index.html/
http://www.google.com/
|
Следует так же изменить структуру base.txt, в начале должна идти номер строки в файле url.txt, которому соответствует данная картинка (нумерация с 0!):
0 aug016-0.jpg Рим. Голова Августа.
0 aug031-0.jpg Голова императора Ав
0 aug040-0.jpg Октавиан Август. Арл
1 aug055-0.jpg Конная статуя Октави
1 aug052-0.jpg Голова Августа из Ар
1 aug043-0.jpg Октавиан Август. Вен
2 aug044-0.jpg Октавиан Август. Вен
2 aug059-0.jpg Голова Октавиана. Мр
2 aug018-0.jpg Октавиан Август. Вер
3 aug047-0.jpg Голова Августа в кор
3 aug027-0.jpg Голова императора Ав
3 aug060-0.jpg Статуя Октавиана Авг
|
Скрипт поиска в этом случае преобретает вид:
<?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," "));
$photo_path[] = trim($url[substr($lines,0,strpos($lines," "))]).$path;
}
}
// Выводим фотографии
foreach($photo_path as $pathp)
{
// Теперь разбиваем строку на директорию и файл
$arr = pathinfo($pathp);
// Ссылка на исходную HTML-страницу
echo "<a href=$arr[dirname]>";
// Ссылка на файл
echo "<IMG src=$arr[basename] width=779 height=106 border=0><br>";
echo "</a>";
unset($arr);
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(20.01.2005 в 22:08)
| | Замечательно, работает!
(http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/search5.htm)
2)
Пример страницы, которую надо проиндексировать? Любая. Например.
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/aug076.htm
Или вот, где на одной станице две картинки:
http://ancientrome.ru/art/artwork/sculp/rom/imp/augustus/aug007.htm
Кстати, подумал - наверное, при переиндексации не надо обновлять данных, чтобы не терять набранных вручную ключевых слов. Т.е., если есть такой файл - то поехали дальше, не меняем.
3) Вывод подписи к картинке в результатах поиска. Ключевые слова, набранные вручную, не выводить (пусть они будут в BASE.TXT в любых скобках, но выводить их не надо.) | |
|
|
|
|
|
|
|
для: cheops
(20.01.2005 в 22:08)
| | Очень жду ответ. Хотя бы по п.3.
Извиняюсь за навязчивость. | |
|
|
|
|
|
|
|
для: SS
(22.01.2005 в 17:35)
| | Что-то просмотрел ваш ответ и он отметился у меня как прочитанный :))) сегодя ближе к ночи постараюсь отписаться... | |
|
|
|
|
|
|
|
для: 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, $out, PREG_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
(23.01.2005 в 02:20)
| | Да, конечно выводить. И если можно, выделить найденный текст жирным. | |
|
|
|
|
|
|
|
для: 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);
}
?>
|
| |
|
|
|
|
|
|
|
для: 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. Удалить какую-то запись получается практически невозможно, - сразу же все поехало. | |
|
|
|
|
|
|
|
для: SS
(23.01.2005 в 03:34)
| | 1) Хорошо сейчас постараюсь быстренько в рекурсию загнать этот скрипт.
a) В общем это не влияет, так как мы просто не используем эти номера, но можно убрать.
б) Пожалуй что да, нужно передлать (в таком формате запись можно удалить, но нужно оставлять пустую строку.) | |
|
|
|
|
|
|
|
для: 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, $out, PREG_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 в 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 в 02:20)
| | Да, совсем забыл!
Бывает и больше двух фотографий на одной html-странице.
Максимум - 5-6.
Что надо для этого дописать? | |
|
|
|
|
|
|
|
для: SS
(23.01.2005 в 15:11)
| | Так как тема уже длинная, обсуждать не удобно - давайте в другую перейдём
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1701 | |
|
|
|
|