preg_replace проблем?...

8 отговора 0 прегледа
#1

preg_replace проблем?...

Пустите 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);


Резултатът: [линк]

В долната част и оригиналната статия... Забележете как снимката е различна, но пък е "изяла" текста...


Истината
Отговор
в отговор на Fallen_Angel #2

Re: preg_replace проблем?...

Май не съм формулирал въпроса много правилно...

Точния ми проблем е следния:

Как с preg_replace да хвана първи празен символ след, да речем, 2000 символа от началото на текста?


Истината
Отговор
в отговор на Fallen_Angel #3

Re: preg_replace проблем?...

Разбира се че изтрива 750-те символа. функцията preg_replace прави точно това. Виж preg_match.
регулярния израз е: .{2000}\S*\s
^ се използва за начало на ред. Дали е неоходим в началото зависи от алгоритъма ти.

По принцип не ти препоръчвам използването на RE в този случай.
По- бързо ще работи с цикъл за символите след 2000, докато срешнеш интервал или нещо подобно. Пък и ще ти е по- лесно.

Отговор
в отговор на Fallen_Angel #4

Re: preg_replace проблем?...

В отговор на:


Ето нещо, което ми казаха на мен: с preg_replace() се решавал проблема

Аз пък ти казвам че не е добре да е preg_replace().
Лично аз бих го направил с цикъл по текста, търсене на интервал след определения символ и слагане на снимката там със str_pos(), substr() и другите функции за работа със стрингове.

С preg_replace ще е лесно ако беше ЕДНА снимка, а при теб са повече ;-)

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy

Отговор
в отговор на vido #5

Re: preg_replace проблем?...

Значи, съвсем целенасочено искам да употребя preg_replce... Искам да хвана първия празен символ след 2000 символа и този празен символ да го презапиша с някакъв стринг...


Истината
Отговор
в отговор на Fallen_Angel #6

Re: preg_replace проблем?...

Щом толкова държиш, принципно е:

preg_replace("/(^.{2000}\S*)(\s)(.*$)/", "\{1}$div\3", $prob);

Това е за една снимка. Може да се направи и за много, ама понапъни се малко и ти.

пп: Не съм го тествал

Редактирано от vido на

Отговор
в отговор на vido #7

Re: preg_replace проблем?...

Не съм сигурен дали е коректно:

"\{1}$div\3"

за това за по- сигурно: '${1}' . $div . '$3',

Редактирано от vido на

Отговор
в отговор на vido #8

Re: preg_replace проблем?...

Супер стана! Много благодаря, ето и целия код:


$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 символа...

Ето и резултата...


Истината
Отговор
в отговор на Fallen_Angel #9

Защо preg_replace тогава?...

preg_replace ти дава възможност да го направиш НАВЕДНЪЖ.
А и както е добре описано str_replace работи много по-бързо и по-добре когато става дума за еденична подмяна както правиш ти !

root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Отговор