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

Форум PHP

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

 

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

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

тема: Помогите оптимизировать код
 
 автор: fmndkn   (04.06.2009 в 13:27)   письмо автору
 
 

Такая ситуация:
Создаётся пост в блоге (текст картинки смайлы - как обычно). Ширина поля вывода поста ограничена, человек же может добавить картинку, которая будет шире чем поле (результат понятен: либо все уедет, либо можно просто через "оверлей" блока обрезать). Оба варианта не устраивают. Посему был написан код, который вычленяет картинки, за исключением смайлов, создает миниатюры и меняет исходный текст полученым результатом

<?php
$orStr 
$arResult["Post"]["textFormated"];
$str preg_split("[(<img[^>]*[^>]*>)]"$arResult["Post"]["textFormated"],-1,PREG_SPLIT_DELIM_CAPTURE); 

$stRep["REPLACE_IMG"] = array("src","title","width","height","alt");
$stRep["REPLACE_STR"] = array("<","\"","=","/>");
$stRep["REPLACE_TO"] = array("1:::","2:::","3:::","4:::","5:::");
$stName = array("1"=>"src","2"=>"title","3"=>"width","4"=>"height","5"=>"alt");

foreach(
$str as $keym => $arStr):
    
$st2 $st3 $st4 = array();
    
$st substr($arStr,1,3);
    if(
$st=="img")
    {
        
$st1 strpos($arStr,"border");
        if(
$st1<=0)
        {
            
$st2[] = explode(" ",str_replace($stRep["REPLACE_STR"],"",$arStr));
            
$arStr str_replace("<","",$arStr);
            foreach(
$st2 as $st3):
                foreach(
$st3 as $st4):
                    
$t explode(":::",str_replace($stRep["REPLACE_IMG"],$stRep["REPLACE_TO"],$st4));
                    for(
$ii=0$ii<count($t); $ii++):
                        if(
$t[0]>0):
                            
$str2[$keym][$arStr][$stName[$t[0]]] = $t[1];
                        endif;
                    endfor;
                    
$w = (($str2[$keym][$arStr]["width"]>300) ? 300 $str2[$keym][$arStr]["width"]);
                    
$h = (($str2[$keym][$arStr]["height"]>200) ? 200 $str2[$keym][$arStr]["height"]);
                    
$str2[$keym][$arStr]["OK"] = '<div style="margin:5px 0;" align="center">
                    <a class="gallery" href="'
.$str2[$keym][$arStr]["src"].'" title="'.$str2[$keym][$arStr]["title"].'">
                        <img alt="'
.$str2[$keym][$arStr]["alt"].'" src="/images/images_res.php?s='.$str2[$keym][$arStr]["src"].'&w='.$w.'&h='.$h.'" title="'.$str2[$keym][$arStr]["title"].'" />
                    </a></div>'
;
                endforeach;
            endforeach;
        }
    }
endforeach;
foreach(
$str2 as $arImage):
    foreach(
$arImage as $kRep => $Imag):
        
$arResult["Post"]["textFormated"] = str_replace("<".$kRep,$Imag["OK"],$orStr);
    endforeach;
endforeach;
?>


Данный код работает без ошибок, но многовато получилось циклов вроде. Возможно что более умелое использование регулярных выражений все и упростило, но с ними я не на "ТЫ".

Может кто-нибудь что подсказать или же так оставить? =)

  Ответить  
 
 автор: Loki   (04.06.2009 в 13:40)   письмо автору
 
   для: fmndkn   (04.06.2009 в 13:27)
 

Может лучше привести пример исходного и финального текста? А то разбирать что делает код, думаю, лень не мне одному...

  Ответить  
 
 автор: fmndkn   (04.06.2009 в 13:54)   письмо автору
 
   для: Loki   (04.06.2009 в 13:40)
 

Да пожалуй
Текст до форматирования:

 text text text text text text text text text<br>

<img src="/blog/d97/nav_logo4.png" title="156143312" alt="" width="168"  height="119">

 text text text text text text text text text text text text

<img src="/blog/d97/nav_logo4.png" title="156143312" alt="" width="168" height="119">
<img src="/blog/d97/nav_logo4.png" title="156143312" alt="" width="168" height="119">

      
text text text text text text text text text text text text text text text text text text text text text text text text

<img src="/images/blog/smile/bl.gif" alt="" border="0"> 

text text text text text text text text text text text text text text text
text text text text text text text text text text text text text text text
<br>

<img src="/images/blog/smile/aj.gif" alt="" border="0">



После работы кода:

 text text text text text text text text text<br>

<div style="margin: 5px 0pt;" align="center">
<a class="gallery" href="/blog/d97/nav_logo4.png" title="156143312">
<img alt="" src="/images/images_res.php?s=/blog/d97/nav_logo4.png&amp;w=168&amp;h=119" title="156143312">
</a></div>


 text text text text text text text text text text text text

<div style="margin: 5px 0pt;" align="center">
<a class="gallery" href="/blog/d97/nav_logo4.png" title="156143312">
<img alt="" src="/images/images_res.php?s=/blog/d97/nav_logo4.png&amp;w=168&amp;h=119" title="156143312">
</a></div>
<div style="margin: 5px 0pt;" align="center">
<a class="gallery" href="/blog/d97/nav_logo4.png" title="156143312">
<img alt="" src="/images/images_res.php?s=/blog/d97/nav_logo4.png&amp;w=168&amp;h=119" title="156143312"></a>
</div>

      
text text text text text text text text text text text text text text text text text text text text text text text text

<img src="/images/blog/smile/bl.gif" alt="" border="0"> 

text text text text text text text text text text text text text text text
text text text text text text text text text text text text text text text
<br>

<img src="/images/blog/smile/aj.gif" alt="" border="0">
 


Жирным - выделен участок над которым велись изменения.
Курсивом - тот участок, который был исключен функцией из обработки, т.к. является смайлом и изменять его не нужно (в коде за это отвечает условие

   $st1 = strpos($arStr,"border");
   if($st1<=0))
   {
           ...............
   }
)

  Ответить  
 
 автор: Loki   (04.06.2009 в 14:07)   письмо автору
 
   для: fmndkn   (04.06.2009 в 13:54)
 

В строке
<img src="/blog/d97/nav_logo4.png" title="156143312" alt="" width="168"  height="119">

Последовательность элементов всегда одинаковая? Какие-то элементы могут меняться местами или отсутствовать?

  Ответить  
 
 автор: fmndkn   (04.06.2009 в 14:14)   письмо автору
 
   для: Loki   (04.06.2009 в 14:07)
 

Последовательность всегда одинакова, разница только в наличии или отсутствии текста (например alt=" "). Отличие картинки пользователя от картинки смайла - наличие в тэге " border="0" "
Главная задача вычленить картинки пользователя, собрать все данные о ней, и произвести свою сборку картинки.

  Ответить  
 
 автор: Loki   (04.06.2009 в 14:19)   письмо автору
 
   для: fmndkn   (04.06.2009 в 14:14)
 

В общем, я сократил до чего-то такого
<?
$str 
preg_split("[(<img[^>]*[^>]*>)]"$arResult["Post"]["textFormated"],-1,PREG_SPLIT_DELIM_CAPTURE); 
$final_text="";
foreach(
$str as $keym => $arStr)
{
    if (
preg_match('/<img\s+src="([^"]+)"\s+title="([^"]*)"\s+alt="([^"]*)"\s+width="([^"]*)"\s+height="([^"]*)">/i'$arStr$info))
    {
        
print_r($info);
        
/*Array
        (
            [0] => <img src="/blog/d97/nav_logo4.png" title="156143312" alt="" width="168"  height="119" 
            [1] => /blog/d97/nav_logo4.png  //src
            [2] => 156143312  //title
            [3] =>   //alt
            [4] => 168   //width
            [5] => 119  //height
        )*/
        
$final_text.=...// тут итоговый код на основе массива $info
    
}
    else 
$final_text.=$arStr;
}


На самом деле есть способ еще красивше - через preg_match_all, но мне почему-то кажется что этот будет работать быстрее.

  Ответить  
 
 автор: fmndkn   (04.06.2009 в 15:14)   письмо автору
 
   для: Loki   (04.06.2009 в 14:19)
 

Обкатаем вариант. Спасибо за помощь! =)

  Ответить  
 
 автор: sim5   (04.06.2009 в 14:13)   письмо автору
 
   для: fmndkn   (04.06.2009 в 13:27)
 

>Создаётся пост в блоге (текст картинки смайлы - как обычно). Ширина поля вывода поста ограничена, человек же может добавить картинку....

Вопрос - почему нужно парсить уже готовое, а не сделать это во время добавления записи и загрузки картинок?

  Ответить  
 
 автор: fmndkn   (04.06.2009 в 14:17)   письмо автору
 
   для: sim5   (04.06.2009 в 14:13)
 

>> Вопрос - почему нужно парсить уже готовое, а не сделать это во время добавления записи и загрузки картинок?

Тоже об этом думал, проблема в том, что при редактировании поста нужно вернуть все обратно, поскольку работа с картинками ведется в отдельном блоке. Объем работы увеличивается в два раза, и там тоже заморочки. Проще парсить только то, что выводится пользователю.

  Ответить  
 
 автор: sim5   (04.06.2009 в 14:21)   письмо автору
 
   для: fmndkn   (04.06.2009 в 14:17)
 

Неужто это такая проблема в блоке, который принимает данные определиться с размером картинки и прочая? По моему вы сами себе проблему надумали, и ее решение у вас сейчас сложнее, чем могло бы быть.

  Ответить  
 
 автор: fmndkn   (04.06.2009 в 15:17)   письмо автору
 
   для: sim5   (04.06.2009 в 14:21)
 

Большого то и не составляет, но решено пока оставить выбор размера за пользователем.
В любом случае ваше мнение учтем в случае модификации ;-)

  Ответить  
Rambler's Top100
вверх

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