|
Тема
|
preg_replace проблем?...
|
|
Автор |
Fallen_Angel (St.Lucifer) |
Публикувано | 08.03.07 21:55 |
|
Пустите regexp са ми мътна и кървава Индия...
Ето проблема, моля, помогнете с решението, благодаря предварително:
Имам статия, дълга достатъчно, за да понесе повече от една снимка. При ъплоуда на статията съм качил заедно ИД-то на статията и снимките.
Сего идва интересното - искам да изкарам снимка вътре в тексто след 750-тия символ... и на следващите 750 - пак и така до изчерване или на символите, или на снимките...
Идеи?
Ето нещо, което ми казаха на мен: с preg_replace() се решавал проблема, ама аз както я ползвам или изтрива 750-те символа, или не прави нищо...
$ext=array(1 => "jpg", 2 => "gif", 3 => "jpeg", 4 => "png");
$morepicz=array();
for($z==1;$z<=6;$z=$z+1){
foreach ($ext as $value) {
$morepicz[$z]='i/th/th_'.$sid.'-'.$z.'.'.$value;
if(file_exists($morepicz[$z])) {
$div="<a href=\"$morepicz[$z]\" target=\"_blank\">
<img src=\"$morepicz[$z]\" border=\"0\" hspace=\"3\" vspace=\"3\" alt=\"$title\"></a>";
}
}
}
$prob=$statiata; // $statiata e texta ot MySQL-a
$prob=preg_replace("/^(.{750})/",$div,$prob);
Резултатът:
В долната част и оригиналната статия... Забележете как снимката е различна, но пък е "изяла" текста...
| |
|
Май не съм формулирал въпроса много правилно...
Точния ми проблем е следния:
Как с preg_replace да хвана първи празен символ след, да речем, 2000 символа от началото на текста?
| |
|
Разбира се че изтрива 750-те символа. функцията preg_replace прави точно това. Виж preg_match.
регулярния израз е: .{2000}\S*\s
^ се използва за начало на ред. Дали е неоходим в началото зависи от алгоритъма ти.
По принцип не ти препоръчвам използването на RE в този случай.
По- бързо ще работи с цикъл за символите след 2000, докато срешнеш интервал или нещо подобно. Пък и ще ти е по- лесно.
| |
|
В отговор на:
Ето нещо, което ми казаха на мен: с preg_replace() се решавал проблема
Аз пък ти казвам че не е добре да е preg_replace().
Лично аз бих го направил с цикъл по текста, търсене на интервал след определения символ и слагане на снимката там със str_pos(), substr() и другите функции за работа със стрингове.
С preg_replace ще е лесно ако беше ЕДНА снимка, а при теб са повече ;-)
root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
| |
Тема
|
Re: preg_replace проблем?...
[re: vido]
|
|
Автор |
Fallen_Angel (St.Lucifer) |
Публикувано | 09.03.07 16:13 |
|
Значи, съвсем целенасочено искам да употребя preg_replce... Искам да хвана първия празен символ след 2000 символа и този празен символ да го презапиша с някакъв стринг...
| |
|
Щом толкова държиш, принципно е:
preg_replace("/(^.{2000}\S*)(\s)(.*$)/", "\{1}$div\3", $prob);
Това е за една снимка. Може да се направи и за много, ама понапъни се малко и ти.
пп: Не съм го тествал
Редактирано от vido на 09.03.07 17:36.
| |
Тема
|
Re: preg_replace проблем?...
[re: vido]
|
|
Автор |
vido (новак) |
Публикувано | 09.03.07 17:46 |
|
Не съм сигурен дали е коректно:
"\{1}$div\3"
за това за по- сигурно: '${1}' . $div . '$3',
Редактирано от vido на 09.03.07 17:49.
| |
Тема
|
Re: preg_replace проблем?...
[re: vido]
|
|
Автор |
Fallen_Angel (St.Lucifer) |
Публикувано | 12.03.07 10:12 |
|
Супер стана! Много благодаря, ето и целия код:
$ext=array(1 => "jpg", 2 => "gif", 3 => "jpeg", 4 => "png");
$morepicz=array();
for($z==0;$z<=5;$z=$z+1){
foreach ($ext as $value) {
$morepicz[$z]='i/th/th_'.$sid.'-'.$z.'.'.$value;
if(file_exists($morepicz[$z])) {
$align="left";
if($z==2 || $z==4 || $z==6) $align="right";
$div[$z]="<a href=\"$morepicz[$z]\" target=\"_blank\"><img src=\"$morepicz[$z]\" border=\"0\" hspace=\"3\"
vspace=\"3\" alt=\"$title\" style=\" float: $align; padding: 2 2 2 2; border: 1px solid #F00000\"></a>";
$offset=$z*2000;
}
}
$statiata=preg_replace("/(^.{".(($z*2000)-2000)."}\S*)(\s)(.*$)/", "\\1 $div[$z]\\3", $statiata);
}
С един FOR търся дали има такъв файл и после с маркера $z от този цикъл отмествам $offset с по 2000 символа...
Ето и
| |
|
preg_replace ти дава възможност да го направиш НАВЕДНЪЖ.
А и както е добре описано str_replace работи много по-бързо и по-добре когато става дума за еденична подмяна както правиш ти !
root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
| |
|
|
|
|