|
|
|
| Такая ситуация:
Создаётся пост в блоге (текст картинки смайлы - как обычно). Ширина поля вывода поста ограничена, человек же может добавить картинку, которая будет шире чем поле (результат понятен: либо все уедет, либо можно просто через "оверлей" блока обрезать). Оба варианта не устраивают. Посему был написан код, который вычленяет картинки, за исключением смайлов, создает миниатюры и меняет исходный текст полученым результатом
<?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;
?>
|
Данный код работает без ошибок, но многовато получилось циклов вроде. Возможно что более умелое использование регулярных выражений все и упростило, но с ними я не на "ТЫ".
Может кто-нибудь что подсказать или же так оставить? =) | |
|
|
|
|
|
|
|
для: fmndkn
(04.06.2009 в 13:27)
| | Может лучше привести пример исходного и финального текста? А то разбирать что делает код, думаю, лень не мне одному... | |
|
|
|
|
|
|
|
для: 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&w=168&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&w=168&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&w=168&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))
{
...............
}
| ) | |
|
|
|
|
|
|
|
для: fmndkn
(04.06.2009 в 13:54)
| | В строке
<img src="/blog/d97/nav_logo4.png" title="156143312" alt="" width="168" height="119">
|
Последовательность элементов всегда одинаковая? Какие-то элементы могут меняться местами или отсутствовать? | |
|
|
|
|
|
|
|
для: Loki
(04.06.2009 в 14:07)
| | Последовательность всегда одинакова, разница только в наличии или отсутствии текста (например alt=" "). Отличие картинки пользователя от картинки смайла - наличие в тэге " border="0" "
Главная задача вычленить картинки пользователя, собрать все данные о ней, и произвести свою сборку картинки. | |
|
|
|
|
|
|
|
для: 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, но мне почему-то кажется что этот будет работать быстрее. | |
|
|
|
|
|
|
|
для: Loki
(04.06.2009 в 14:19)
| | Обкатаем вариант. Спасибо за помощь! =) | |
|
|
|
|
|
|
|
для: fmndkn
(04.06.2009 в 13:27)
| | >Создаётся пост в блоге (текст картинки смайлы - как обычно). Ширина поля вывода поста ограничена, человек же может добавить картинку....
Вопрос - почему нужно парсить уже готовое, а не сделать это во время добавления записи и загрузки картинок? | |
|
|
|
|
|
|
|
для: sim5
(04.06.2009 в 14:13)
| | >> Вопрос - почему нужно парсить уже готовое, а не сделать это во время добавления записи и загрузки картинок?
Тоже об этом думал, проблема в том, что при редактировании поста нужно вернуть все обратно, поскольку работа с картинками ведется в отдельном блоке. Объем работы увеличивается в два раза, и там тоже заморочки. Проще парсить только то, что выводится пользователю. | |
|
|
|
|
|
|
|
для: fmndkn
(04.06.2009 в 14:17)
| | Неужто это такая проблема в блоке, который принимает данные определиться с размером картинки и прочая? По моему вы сами себе проблему надумали, и ее решение у вас сейчас сложнее, чем могло бы быть. | |
|
|
|
|
|
|
|
для: sim5
(04.06.2009 в 14:21)
| | Большого то и не составляет, но решено пока оставить выбор размера за пользователем.
В любом случае ваше мнение учтем в случае модификации ;-) | |
|
|
|