Obmedzeny str_replace – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Obmedzeny str_replace – PHP – Fórum – Programujte.comObmedzeny str_replace – PHP – Fórum – Programujte.com

 

dalaman0
Věrný člen
24. 5. 2007   #1
-
0
-

V texte zamienam par stringov inymi stringami:



$hotsprava=str_replace($najst, $nahradit, $sprava);


$najst je pole znakove ktore maju byt nahradene
$nahredit je pole znakov za ktore sa ma $najst nahradit..

Ono to funguje, lenze ked chcem obmedzit pocet nahradeni tak mi to nefunguje


$count=5;
$hotsprava=str_replace($najst, $nahradit, $sprava, $count);


Neviete kde je problem ??

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
Ondrej Juríček
~ Moderátor
0
Stálý člen
24. 5. 2007   #2
-
0
-

Premenná $count ti vracia počet zamenených reťazcov a neurčuje, koľko sa má zameniť!

Viz. manuál:
"Poznámka: Od PHP 5.0.0 je počet nalezených a zaměněných řetězců (search) vrácen v parametru count, který je předáván referencí. Před PHP 5.0.0 není tento parametr k dispozici."

Nahlásit jako SPAM
IP: ...–
24. 5. 2007   #3
-
0
-

Cesky: ty zavolas tu funkci, a potom v te promenne najdes pocet tech nahrazenych retezcu. Je to tedy pouze informativni, samotnou funkci to neovlivnuje.

Nahlásit jako SPAM
IP: ...–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
dalaman0
Věrný člen
24. 5. 2007   #4
-
0
-

Tak to mam potom blby navod... Sakra knizka za 700 korun a potom tu nieco robte :) ....

A ako by sa dalo spravit aby mi nahradilo len prvych 5 vyskytov /??

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
Jan Bednařík0
Super člen
25. 5. 2007   #5
-
0
-

To dalaman: Třeba pomocí stripos() najdi první výskyt řetězce, pomocí substr_replace() ho nahraď a udělej to tak pětkrát.

Nahlásit jako SPAM
IP: ...–
Python + Django + PostgeSQL = spokojený vývojář :-)
dalaman0
Věrný člen
31. 5. 2007   #6
-
0
-

NEbolo to jednoduche, pretoze $najst a $nahradit su polia...

HERE IT IS:



$sprava="  ".$sprava;

for ($a=1;$a<6;$a++)
{
$b=0;
$minb=0;
$poz=1000;
$minpoz=1000;

foreach ($najst as $smajlik)
{
$poz=strpos($sprava,$smajlik);
if (($poz < $minpoz)&&($poz!=false))
{
$minpoz=$poz;
$minb=$b;
}
$b++;
}
if ($minpoz<1000) $sprava=substr_replace($sprava,$nahradit[$minb],$minpoz,2);
}
$hotsprava=$sprava;

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
Prog.0
Věrný člen
1. 6. 2007   #7
-
0
-

Celkom fajn, len par pripomienok:

namiesto:

if (($poz < $minpoz)&&($poz!=false))

pouzi radsej:
if ($poz!==false && $poz < $minpoz)

pretoze ak sa hladany vyraz najde na pozicii 0 tak (poz!=false) bude davat false.
(0==false dava true, 0===false dava false, 0!==false dava true)
http://php.net/manual/en/language.operators.comparison.php
Poradie podmienok navrhujem prehodit -- slusnejsie je najprv overit, ci je premmenna ciselna (nie je false) a az potom zistovat ci je mensia. (podmienky sa vykonavaju zlava doprava -- ak je prva false, druha sa v operacii AND (&&) uz nevykonava - 0 && ? = 0)


k riadkom $poz=1000 a $minpoz=1000 -- osobne nemam rad taketo konstanty, ale je to na tebe. No nikdy nevies, kedy ktory blazon znasilni tvoju fciu a posle do nej viac ako 1000 znakov ? :-))


Nasledujuci kod:
$b = 0;

foreach ($najst as $smajlik)
{
...
$b++;
}

sa da spravit cistejsie (zachova sa skutocne indexovanie aj v pripade ze nejde zaradom 0,1,2...n-1):
foreach($najst as $b => $smajlik)

{
...
}


Chyba mi tam este jedna vec, a to, ze ak sa nieco najde, nahradi, tak hladanie zacina od zaciatku retazca, pritom by stacilo niekde zapisat poziciu, kde sa prave nechadzas a pokracovat z miesta kde si skoncil... - tyka sa to hlavne strcenia offsetu do fcie strpos(,,[podtrzene]$offset[/podtrzene])

A posledna pripomienka, pocet opakovani (6) sa vykona aj v pripade, ze sa nenajde ziaden hladany retazec. Staci za poslednu podmienku
if ($minpoz<1000)... doplnit: else break; ktora ukonci cyklus...


Oki, aby som len nekvakal, tak davam navrhovane upravy dokopy:
function limited_str_replace($find,$replacement,$subject,$max=null,&$real_count=0)

{
// aby bolo mozne zadavat do vstupu aj stringy aj polia:
if (!is_array($find)) $find = Array($find);
if (!is_array($replacement)) $replacement = Array($replacement);

$real_count = 0; // skutocny pocet nahradenych

for($count=0;$count<$max || $max==null;$count++)
{
$pos=0;
$found_at=null;
$found_i=null;

foreach($find as $i => $f)
{
$p=strpos($subject,($f = $find[$i]),$pos);
if ($p!==false && ($found_at===null || $p<$found_at))
{
$found_at = $p;
$found_i = $i;
}
}
if ($found_i!==null)
{
$found_len = strlen($f=$find[$found_i]);
$replace_len = strlen($r=$replacement[$found_i]);

$subject = substr_replace($subject, $r, $found_at,$found_len);
$pos = $found_i+$replace_len;
$real_count++;
} else
break;
}
return $subject;
}

Nahlásit jako SPAM
IP: ...–
Prog.
dalaman0
Věrný člen
3. 6. 2007   #8
-
0
-

No wow.... presne skoro tak som to chcel urobit ale chybali mi vedomosti...

1.vedel som ze by mi to robilo neplechu na nultej pozicii tak som tam dal

$sprava="  ".$sprava;
a bolo vyriesene :) :) LOL
No to tvoje lepsie>>> $p!==false >>> toto som potreboval vediet... Super...

2. $poz=1000 a $minpoz=1000 Take konstanty nemam ani ja moc rad lebo sa im neda vzdy verit... Lenze mna by nikdy nenapadlo dat tam null :) (takze dalsi dobry poznatok)

3.S tym offsetom si mi pomohol asi najviac , pretoze sa som mal nejake hladane stringy aj v poli $replacement, cize sa to zamienalo dookola :)

TAKZE DIKY TI MOC ZA POUCNY PRISPEVOK

[podtrzene]P.S.: predsa mam nejake otazky:[/podtrzene]
*
Preco v tejto casti


foreach($find as $i => $f)
{
$p=strpos($subject,($f = $find[$i]),$pos);
......

davas f-cii strpos $f = $find[$i] a nie priamo $f? Ved foreach ti priradi do premennej $f hodnotu na $i-tej pozicii... ci sa mylim ?

*
Posledny vstup do tvojej f-cie je $real_count... Ako ho mozem vyuzit???

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
dalaman0
Věrný člen
3. 6. 2007   #9
-
0
-

Uf.. vlastne som zistil ze robi velku neplechu stale s tym bodom 3. V poli $replacement sa nachadza jeden string z polia $find takze ak sa nahradi tak ri dalsom vykonavani cyklu sa to nahradi v stede znova a znova ($max krat).. No co uz... toto sa uz odstranit neda tak lahko... upravim radsej jednotlive polia :)

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
Prog.0
Věrný člen
4. 6. 2007   #10
-
0
-

lol, to s tym dvojitym priradenim do $f je preklep :-D

Nahradzovanie uz nahradenych poloziek - teraz som v tom nasiel dva bugy:
1) premenna $pos je zakazdym nulovana - ta definicia $pos=0 mala ist este pred ten for...
2) vypocet pozicie $pos = [podtrzene]$found_i[/podtrzene]+$replace_len; je zly lebo found_i je index polozky, ktoru hladam v poli, a nie pozicia. mala tam byt $found_at.

...I'm very many sorry, netestoval som to, ale uz by to malo byt O.K. :-)


real_count -- skutocny pocet nahradenych:

$subject = limited_str_replace($find,$replacement,$subject,null, $pocet); 

echo $pocet;


Takze este raz, dufam ze uz bez chyb:
function limited_str_replace($find,$replacement,$subject,$max=null,&$real_count=0)

{
if (!is_array($find)) $find = Array($find);
if (!is_array($replacement)) $replacement = Array($replacement);

$real_count=0; $pos=0;

for($count=0;$count<$max || $max==null;$count++)
{
$found_at=null; $found_i=null;
foreach($find as $i => $f)
{
$p=strpos($subject,$f,$pos);
if ($p!==false && ($found_at===null || $p<$found_at))
{
$found_at = $p;
$found_i = $i;
}
}
if ($found_i!==null)
{
$found_len = strlen($f=$find[$found_i]);
$replace_len = strlen($r=$replacement[$found_i]);
$subject = substr_replace($subject, $r, $found_at,$found_len);
$pos = $found_at+$replace_len;
$real_count++;
} else
break;
}
return $subject;
}

Nahlásit jako SPAM
IP: ...–
Prog.
dalaman0
Věrný člen
5. 6. 2007   #11
-
0
-

JJ , uz to funguje na jednotku....

S tym nulovanim $poc som si to vsimol aj ja ... len som to tu zabudl napisat...
A s tyym $found_at dikes.... Takze tam bol pes zakopany :)

Skript si mozes overit tu :) http://gymdca.php5.cz/index.php?page=guestbook

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
Prog.0
Věrný člen
6. 6. 2007   #12
-
0
-

Nice, len by som zmenil v "Ako sa vám pá[podtrzene]è[/podtrzene]ia nové stránky?" na č ;-)

Nahlásit jako SPAM
IP: ...–
Prog.
dalaman0
Věrný člen
6. 6. 2007   #13
-
0
-

JA tam mam 'č' neviem . kde je probleeem.. ;(

Nahlásit jako SPAM
IP: ...–
Lepšie je mať psa na saláme ako salámu pod psom !!!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 37 hostů

Podobná vlákna

Str_Replace() — založil Milan

Str_Replace — založil Michal115

Str_replace? — založil x-flyer

Chyba v str_replace — založil Anonym

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý