$ftext = '<table border=0 cellPadding=0 cellSpacing=0 width=780>
<tr><td bgcolor=#6f67b5 colspan=3><img src="/pic/tr.gif" width=1 height=1 border=0></td></tr>
<tr>
<td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
<td bgcolor=#ffffff><img src="/pic/tr.gif" width=1 height=1 border=0></td>
<td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
</tr>
<tr>
<td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
<td align=middle bgcolor=#6f67b5>
<table border=0 cellpadding=0 cellspacing=0 width=778>
<tr><td bgcolor=#6f67b5 class=white height=22 valign=top>Новости Hi-Tech индустрии</td></tr>
</table>
</td>
<td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
</tr>
<tr>
<td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
<td bgcolor=#ffffff><img src="/pic/tr.gif" width=1 height=1 border=0></td>
<td bgcolor=#6f67b5><img src="/pic/tr.gif" width=1 height=1 border=0></td>
</tr>
</table>';
preg_match_all('/<table(.*)<\/table>/i', $ftext, $content_arr);
$ftext = $content_arr[0][0];
echo($ftext);
?>
Кеширование картинок на сайте
Мне нужно две функции:
1) Я передаю ей хтмл код она находит в нем картинки и кеширует их. Возращается хтмл код, в котором содержатся новые ссылки на картинки (на мой сайт).
2) Очистка папки с картинками.
ЗЫ проблема в том, что с файлами никогда не работал
гм не совсем справился. Кто объяснит
Код:
Где ошибка? Че ниче не выводит?
1. Анализ кода, нахождение тегов img, вытаскивание путей.
Если пути относительные, то конвертация их в абсолютные.
Например в теге стоит:
/pic/tr.gif и это на сате mts.ru, тогда абсолютный путь будет
http://mts.ru/pic/tr.gif
2. Копирование этой картинки (а это по сути обычный файл) к себе на сервер функцией PHP copy в какую нибудь директорию
3. Исправление в коде старого пути к картинке на новый (хоть абсолютный, хоть относительный)
Можно еще вариант 2:
Полностью воссоздавать у себя такую же структуру папок и копировать картинки в эти папки. В этом случае в коде пути менять не надо. (лично я так и сделал). То есть у тебя на сайте будет папка pic и в в этой папке будет файл tr.gif
Ну а насчет
2) Очистка папки с картинками.
Что ж здесь сложного то... Проход циклом по всем файлам в каталоге, хошь выборочно удаляй по какому нибудь условию, хошь все удаляй...
Тема зацепила, сейчас попробую набросать что-нибудь...
Предлагаю такой вариант:
Сначала определим некоторые полезные библиотечки:
Код:
interface IFileIO
{
static function GetRemoteFile($Url);
static function SaveLocalFile($Resource, $FileName);
}
interface IURL extends IFileIO
{
static function GetAbsoluteUrl($Addr, $URL);
static function ParseURL($URL);
static function ExtractFileName($Str, $issetExt = false);
}
/*IMPLEMENTATIONS*/
class FileIO implements IFileIO
{
static function GetRemoteFile($Url){ return file_get_contents($Url); }
static function SaveLocalFile($Resource, $FileName){ file_put_contents($FileName, $Resource); }
}
class URL implements IURL
{
static function GetAbsoluteUrl($Addr, $URL){
$URL = self::ParseURL($URL);
$PURL = self::ParseURL($Addr);
$Query = isset($PURL['query']) ? "?{$PURL['query']}" : "";
if (!isset($PURL['scheme'])){
$Addr = "{$URL['scheme']}://{$URL['host']}/{$PURL['path']}{$Query}";
}
return $Addr;
}
static function ParseURL($URL){
return parse_url($URL);
}
static function ExtractFileName($Str, $issetExt = false){
$Path = self::ParseURL($Str);
$Pat = preg_match("/\//", $Path['path']) ? "/^.*\/(\w+\.\w+|\w+)/" : "/^(\w+\.\w+|\w+)/";
preg_match_all($Pat, $Str, $Arr, PREG_SET_ORDER);
if (count($Arr)){
if ($issetExt){
if (!preg_match("/\w+\.\w+/", $Arr[0][1])){
return false;
}
else return true;
}
else return $Arr[0][1];
}
else return false;
}
static function GetRemoteFile($Url){}
static function SaveLocalFile($Resource, $FileName){}
}
class ImageUtils
{
static function GetImageInfo($URL){
$Info = getimagesize($URL);
switch ($Info[2]){
case 1: $Ext = ".gif"; break;
case 2: $Ext = ".jpg"; break;
case 3: $Ext = ".png"; break;
case 4: $Ext = ".swf"; break;
case 5: $Ext = ".psd"; break;
case 6: $Ext = ".bmp"; break;
case 7: $Ext = ".tif"; break;
default: "";
}
$Info['ext'] = $Ext;
return $Info;
}
static function NormalizeImageExt($FileName, $Info){
preg_match("/^([\w-]*)\.{0,1}/", $FileName, $Arr);
return "{$Arr[1]}{$Info['ext']}";
}
}
{
static function GetRemoteFile($Url);
static function SaveLocalFile($Resource, $FileName);
}
interface IURL extends IFileIO
{
static function GetAbsoluteUrl($Addr, $URL);
static function ParseURL($URL);
static function ExtractFileName($Str, $issetExt = false);
}
/*IMPLEMENTATIONS*/
class FileIO implements IFileIO
{
static function GetRemoteFile($Url){ return file_get_contents($Url); }
static function SaveLocalFile($Resource, $FileName){ file_put_contents($FileName, $Resource); }
}
class URL implements IURL
{
static function GetAbsoluteUrl($Addr, $URL){
$URL = self::ParseURL($URL);
$PURL = self::ParseURL($Addr);
$Query = isset($PURL['query']) ? "?{$PURL['query']}" : "";
if (!isset($PURL['scheme'])){
$Addr = "{$URL['scheme']}://{$URL['host']}/{$PURL['path']}{$Query}";
}
return $Addr;
}
static function ParseURL($URL){
return parse_url($URL);
}
static function ExtractFileName($Str, $issetExt = false){
$Path = self::ParseURL($Str);
$Pat = preg_match("/\//", $Path['path']) ? "/^.*\/(\w+\.\w+|\w+)/" : "/^(\w+\.\w+|\w+)/";
preg_match_all($Pat, $Str, $Arr, PREG_SET_ORDER);
if (count($Arr)){
if ($issetExt){
if (!preg_match("/\w+\.\w+/", $Arr[0][1])){
return false;
}
else return true;
}
else return $Arr[0][1];
}
else return false;
}
static function GetRemoteFile($Url){}
static function SaveLocalFile($Resource, $FileName){}
}
class ImageUtils
{
static function GetImageInfo($URL){
$Info = getimagesize($URL);
switch ($Info[2]){
case 1: $Ext = ".gif"; break;
case 2: $Ext = ".jpg"; break;
case 3: $Ext = ".png"; break;
case 4: $Ext = ".swf"; break;
case 5: $Ext = ".psd"; break;
case 6: $Ext = ".bmp"; break;
case 7: $Ext = ".tif"; break;
default: "";
}
$Info['ext'] = $Ext;
return $Info;
}
static function NormalizeImageExt($FileName, $Info){
preg_match("/^([\w-]*)\.{0,1}/", $FileName, $Arr);
return "{$Arr[1]}{$Info['ext']}";
}
}
Ну и сама реализация всей этой беды:
Код:
// Пути, разумеется, следует поменять.
define("REMOTE_HTML", "http://hunter.kbtour.ru/photosession42.htm");
define("SAVE_HTML", "{$_SERVER['DOCUMENT_ROOT']}/probe.html");
define("IMAGE_DIR", "{$_SERVER['DOCUMENT_ROOT']}/primg/");
define("IMAGE_URL_PATH", "http://mfender/primg/");
set_time_limit(180);
if(!is_dir(IMAGE_DIR)) mkdir(IMAGE_DIR);
$DOC = new DOMDocument("1.0", "windows-1251");
@$DOC->loadHTML(file_get_contents(REMOTE_HTML));
foreach ($DOC->getElementsByTagName("img") as $Node){
$Src = $Node->getAttribute("src");
$Info = ImageUtils::GetImageInfo(URL::GetAbsoluteUrl($Src, REMOTE_HTML));
$FileName = ImageUtils::NormalizeImageExt(URL::ExtractFileName($Src), $Info);
$ImgURL = URL::GetAbsoluteUrl($Src, REMOTE_HTML);
$Img = FileIO::GetRemoteFile($ImgURL);
if(@$Img){
FileIO::SaveLocalFile($Img, IMAGE_DIR.$FileName);
$Node->setAttribute("src", IMAGE_URL_PATH.$FileName);
}
}
$DOC->normalizeDocument();
$DOC->formatOutput = true;
FileIO::SaveLocalFile(html_entity_decode($DOC->saveHTML()), SAVE_HTML);
define("REMOTE_HTML", "http://hunter.kbtour.ru/photosession42.htm");
define("SAVE_HTML", "{$_SERVER['DOCUMENT_ROOT']}/probe.html");
define("IMAGE_DIR", "{$_SERVER['DOCUMENT_ROOT']}/primg/");
define("IMAGE_URL_PATH", "http://mfender/primg/");
set_time_limit(180);
if(!is_dir(IMAGE_DIR)) mkdir(IMAGE_DIR);
$DOC = new DOMDocument("1.0", "windows-1251");
@$DOC->loadHTML(file_get_contents(REMOTE_HTML));
foreach ($DOC->getElementsByTagName("img") as $Node){
$Src = $Node->getAttribute("src");
$Info = ImageUtils::GetImageInfo(URL::GetAbsoluteUrl($Src, REMOTE_HTML));
$FileName = ImageUtils::NormalizeImageExt(URL::ExtractFileName($Src), $Info);
$ImgURL = URL::GetAbsoluteUrl($Src, REMOTE_HTML);
$Img = FileIO::GetRemoteFile($ImgURL);
if(@$Img){
FileIO::SaveLocalFile($Img, IMAGE_DIR.$FileName);
$Node->setAttribute("src", IMAGE_URL_PATH.$FileName);
}
}
$DOC->normalizeDocument();
$DOC->formatOutput = true;
FileIO::SaveLocalFile(html_entity_decode($DOC->saveHTML()), SAVE_HTML);
Комментировать лень. будут вопросы - задавайте.
=====
Note: При написании всей этой ахинеи не пострадало ни одного бенгальского тигра и вообще ни одно живое существо, кроме трёх бутылок пива. Автор выражает особую благодарность справочнику на сайте shaelf'а, которым пришлось воспользоваться, пока падал php.net.
эээээ нихрена не понял. Я вообще начинающий. Шо такое interface и static?
[QUOTE=Alximik]эээээ нихрена не понял. Я вообще начинающий. Шо такое interface и static?[/QUOTE]
http://www.php.net/manual/en/language.oop5.php[/QUOTE]
гм вроде ясно сенк
А с регЕкспами я мануал прочитал, но все равно не пашет :(
http://forum.codenet.ru/showthread.php?p=149528&posted=1#post149528
Note: При написании всей этой ахинеи не пострадало ни одного бенгальского тигра и вообще ни одно живое существо, кроме трёх бутылок пива. Автор выражает особую благодарность справочнику на сайте shaelf'а, которым пришлось воспользоваться, пока падал php.net.[/QUOTE]
А можно тоже самое, но без использования DOMDocument???
Блин, а можно тоже самое, но без библиотек и т.д. Просто 2 функциии и все. Без наворотов.
[color="red"]
1. Не нужно писать по одной строчке в сообщении, если не кто не ответил, просто отредактируй своё.
2. Тут не нужны цитаты на полстраницы.
[/color]
А можно, а можно... Блин... мфендер всё отлично написал.. ты не представляешь как это надо будет парится искать эти теги путём регэкспов... А есди, как ты говоришь, сделать без библиотек и т.д., то од возрастёт в несколько раз.... Да! И не воскрешай темы и не занимайся оверквотингом! ]:-[