Класс Автоматическое размещение картинки в тексте

Тема в разделе "PHP", создана пользователем krobol, 14 окт 2010.

  1. krobol

    krobol Member

    Регистр.:
    30 июн 2009
    Сообщения:
    263
    Симпатии:
    1
    Помогите написать класс - результат останется здесь для всех

    Правильно ли я ставлю задачу?:

    Исходные данные:
    - массив текстов, в которые нужно подставлять картинки
    - директория с картинками (для начала только JPG)
    - параметры вставки: % статей, в которые нужно вставлять 1 картинку; % статей в которые вставлять 2 картинки; % статей в которые вставлять 3 картинки (больше, думаю не нужно); тег - предшествующий имени файла картинки (например, http://site.com/images или {IMG_PATH}); имя css-класса для картинки

    После обработки получаем массив текстов, в которых вставлены картинки в произвольные места текстов, в соответствии с параметрами
     
  2. krobol

    krobol Member

    Регистр.:
    30 июн 2009
    Сообщения:
    263
    Симпатии:
    1
    Ответ: Автоматическое размещение картинки в тексте

    Предполагаемая структура класса. В дальнейшем возможно расширение до вставки ссылок на ютубе-видео и прочих возможных мультимедия.

    [HIDE="1"]
    PHP:
    <?php
    /*
    * Вставка мультимедиа объектов в тексты v.0.1
    *
    *
    */
    class mm_improver

        private 
    $aText = Array();             // массив текстов
        
    private $pathImages 'input/images'// дирректория с исх. картинками
        
    private $pathResImages 'images';    // дирректория со вставленными картинками
        
    private $ratio1img 60;              // процент текстов с 1-ой картинкой
        
    private $ratio2img 15;              // процент текстов с 2-мя картинками
        
    private $ratio3img 5;               // процент текстов с 3-мя картинками
        
    private $tagImgPath '{IMG_PATH}';   // путь к картинкам на сайте
        
    private $aTagImgCSS = Array(          // массив стилей для картинок
            
    'class="img_left"',
            
    'class="img_right"',
            
    'class="img_center"'
        
    );
        
        public function 
    mm_improver($aText = Array())          // инициализация класса
        
    {
            
    $this->set_texts($aText);
        }
        
        public function 
    set_texts($aText)           // загрузить тексты для обработки
        
    {
            
    $this->$aText $aText;
        }
        
        public function 
    get_texts()           // получить результат - массив текстов
        
    {    
        }
        
        public function 
    insert_images()       // вставить в тексты картинки
        
    {    
        }
        
        static public function 
    check_images_qty()    // проверить наличие нужного кол-ва картинок
        
    {    
        }
    }

    ?>
    [/HIDE]
     
    Последнее редактирование: 14 окт 2010
  3. krobol

    krobol Member

    Регистр.:
    30 июн 2009
    Сообщения:
    263
    Симпатии:
    1
    Ответ: Автоматическое размещение картинки в тексте

    и никто не пришёл хороводы водить :(

    готовый класс:

    [HIDE="1"]
    PHP:
    <?php
    /*
    * Вставка мультимедиа объектов в тексты v.1.0
    *
    *
    */
    class mm_improver

        private 
    $aText;         // массив текстов
        
    private $aRatioImg;     // процент текстов с 1-ой картинкой, c 2-мя, c 3-мя
        
    private $tagImgPath;    // путь к картинкам на сайте
        
    private $aTagImgCSS;    // массив стилей для картинок
        
    private $pathImages;    // дирректория с исх. картинками
        
    private $pathResImages// дирректория со вставленными картинками
        
        // инициализация класса
        
    public function mm_improver(
            
    $aText = Array(),
            
    $aRatioImg = Array(60105),
            
    $tagImgPath '{IMG_PATH}',
            
    $aTagImgCSS = Array('class="img_left"''class="img_center"''class="img_right"'),
            
    $pathImages 'input/images',
            
    $pathResImages 'images'
        
    )
        {
            
    $this->set_texts($aText);
            
    $this->aRatioImg $aRatioImg;
            
    $this->tagImgPath $tagImgPath;
            
    $this->aTagImgCSS $aTagImgCSS;
            
    $this->pathImages rtrim($pathImages'/');
            
    $this->pathResImages rtrim($pathResImages'/');
        }
        
        
    // загрузить тексты для обработки
        
    public function set_texts($aText = Array())
        {
            
    $this->aText $aText;
        }
        
        
    // получить результат - массив текстов
        
    public function get_texts()
        {    
            return 
    $this->aText;
        }
        
        
    // вставить в текст строку
        
    private function insertSTRtoTEXT($text$str)
        {
            
    $aLines explode(".",$text);
            
            
    $partNum floor(rand(09) / 3);
            
    $partNum = ($partNum == 0) ? $partNum;
            
    $lineNum rand(round(($partNum-1) * count($aLines)/3), round($partNum count($aLines)/1));
            
            
    $aLines[$lineNum] = "\r\n".$str."\r\n".$aLines[$lineNum];
            
    $text implode("."$aLines);
            
            return 
    $text;
        }
        
        
    /*
                * вставить в тексты картинки
                * $flMoveImages - переносить использованные картинки
                */
        
    public function insert_images($flMoveImages TRUE)
        {
            
    // подготавливаем массив $aSpaces, в котором для каждой статьи указано кол-во картинок, которые нужно вставить
            
    $countText count($this->aText);
            
    $aSpaces = Array();
            foreach(
    $this->aRatioImg as $numRatio => $ratio)
            {
                
    $tmpCount round$countText $ratio 100 );
                
    $tmpArray array_fill(0$tmpCount$numRatio 1);
                
    $aSpaces array_merge($aSpaces$tmpArray);
            }
            
    $tmpArray array_fill(0$countText count($aSpaces), 0);
            
    $aSpaces array_merge($aSpaces$tmpArray);
            
    shuffle($aSpaces);
            
    // ----------------------------------------
            
            
    $aImages glob($this->pathImages."/*.jpg");
            
    shuffle($aImages);
            
    $curImgNum 0;
            
    $maxImgNum count($aImages) - 1;
            foreach(
    $this->aText as $numText => $text)
            {
                for(
    $i 0$i $aSpaces[$numText]; $i++){
                    if(
    $curImgNum $maxImgNum) break;
                    
    $tmpCSS '';
                    
    $tmpCSS $this->aTagImgCSS[rand(0count($this->aTagImgCSS) - 1)];
                    
                    
    $tmpImg '<img'
                        
    .($tmpCSS ' '.$tmpCSS.' ' '')
                        .
    'src="'.$this->tagImgPath.'/'.basename($aImages[$curImgNum])
                        .
    '" alt="" />';
                    
    $this->aText[$numText] = $this->insertSTRtoTEXT($text$tmpImg);
                    
    // перенос использованных картинок
                    
    if($flMoveImagesrename($aImages[$curImgNum], $this->pathResImages.'/'.basename($aImages[$curImgNum]));
                    
    $curImgNum++;
                }
            }
            return 
    $this->aText;
        }
        
        
    /* 
                * проверить наличие нужного кол-ва картинок
                * возвращает сколько картинок не хватает, 0 - картинок достаточно
                */
        
    public function check_images_qty()
        {
            
    $aImages glob($this->pathImages."/*.jpg");
            
    $countImg count($aImages);
            
    $countText count($this->aText);
            
            
    $countSpace 0;
            foreach(
    $this->aRatioImg as $numRatio => $ratio)
            {
                
    $countSpace += ($numRatio 1) * round($countText $ratio 100);
            }
            
            
    $res = ($countSpace $countImg) > ? ($countSpace $countImg) : 0;
            return 
    $res;
        }
    }

    ?>
    [/HIDE]

    использование:

    [HIDE="1"]
    PHP:
    <?php

    require_once('lib/mm_improver.php');

    // формируем массив статей aText
    $text file_get_contents('input/articles.txt');
    preg_match_all('%<article>(.*?)</article>%ims'$text$aArticles);
    $aText $aArticles[1];

    // вставляем картинки в тексты (картинки в дирректории input/images)
    $mm_improver = new mm_improver($aText, Array(60105), 'input/images');

    /*
    // проверка на достаточное кол-во картинок
    $imgNeed = $mm_improver->check_images_qty();
    if( $imgNeed )
    {
        echo 'Для расстановки не хватает '.$imgNeed.' картинок!';
        exit;
    }
    */

    $aText $mm_improver->insert_images(FALSE);

    print_r($aText);

    ?>
    [/HIDE]
     
    Последнее редактирование: 15 окт 2010
  4. invergo

    invergo New Member

    Регистр.:
    24 май 2009
    Сообщения:
    35
    Симпатии:
    0
    Ответ: Автоматическое размещение картинки в тексте

    Лучшая помощь когда человек сам сможет сделать. Так что тебе помогли ))
     
  5. krobol

    krobol Member

    Регистр.:
    30 июн 2009
    Сообщения:
    263
    Симпатии:
    1
    Ответ: Автоматическое размещение картинки в тексте

    Доработанный класс.

    MM_IMPROVER - вставка мультимедиа объектов в тексты
    - вставка изображений в случайную позицию текста (вероятность вставки в верхнюю треть текста выше)
    - регулировка % статей для вставки изображения и их количества
    (по умолчанию в 60% статей вставлять 1 картинку, в 10% статей - 2 картинки, в 5% статей - 3 картинки)
    - автоматическое добавление тега ALT на основе анализа текста
    - обрабатываются JPG-изображения

    [HIDE="1"] Посмотреть вложение mm_improver.zip [/HIDE]
     
  6. s3user

    s3user New Member

    Регистр.:
    4 мар 2011
    Сообщения:
    2
    Симпатии:
    0
    Ответ: Автоматическое размещение картинки в тексте

    спасибо. давно искал что-то подобное.
     

Поделиться этой страницей