[PHP] str_replace meer vervangen in een keer?

Pagina: 1
Acties:

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Hoi,

Ondertussen heb ik een template parser in PHP in elkaar geknutseld. Die heb ik nu aangepast zodat ik ook loops kan parsen en daar wil ik eigenlijk nog wat snelheid winnen en de code nog simpeler maken.

Weet iemand of het mogelijk is om met str_replace meerdere tags in een keer te vervangen?
Wat ik nu heb is een array met gegevens zoiets als dit:
info['id'] = "1";
info['naam'] = "Tekst hierzo";

Dan heb ik een regel html met tags bijvoorbeeld:
code:
1
<tr><td>Nummer: {product_id} Naam: {product_naam}</td></tr>

Dit zou dan een productenlijst moeten worden omdat het geheel tussen loop tags staat.
Nu roep ik dus twee keer de str_replace aan. Een keer om het ID erin te zetten en een keer om de naam erin te zetten.
Kan dit niet in een keer? Dus met een regel str_replace meteen beide tags vervangen.

Alvast bedankt.

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Je kan het met arrays doen, zie de manual.
If search and replace are arrays, then str_replace() takes a value from each array and uses them to do search and replace on subject. If replace has fewer values than search, then an empty string is used for the rest of replacement values. If search is an array and replace is a string; then this replacement string is used for every value of search.

This can no longer be ignored.


Verwijderd

str_replace(array(),array(),$var);

  • tomato
  • Registratie: November 1999
  • Niet online
Erik Jan: Je kan het met arrays doen, zie de manual.
[..]
Ik vermoed alleen dat er dan nog steeds gewoon een x aantal str_replace()'s uitgevoerd wordt.

Je kunt het natuurlijk ook omdraaien. Je gaat nu iedere variabele langs en daarvoor voer je een replace op de tekst uit. Je kunt ook de hele tekst afgaan en als je een {var} tegenkomt replace je die.

Een botte manier daarvoor is zoiets:
code:
1
$s = preg_replace('/{([^}]+)}/e', '$info[$1]', $s)

Maar of dat sneller zal zijn :?

[edit] Het laatste idee kun je natuurlijk wel op een wat fraaiere manier uitvoeren dan met die s///e regex ;)

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Hmmm ja, dus het zou moeten werken als ik een array heb die de verschillende tags bevat met de bijbehorende values?

Dan zou het dus zoiets moeten worden lijkt me:
code:
1
$nieuweregel = str_replace($arraymettags, $arraymetvalues, $stringmethtmlentags);

De waardes zitten namelijk in een array, de tags staan in een string.
Ik ga maar weer eens wat proberen.

Verwijderd

werkt je template engine oook met blocks in blocks
??

[block]
bla bla bla
[block]
bla bla bla
[/block]
sdf
[/block]

?? zoiets heb ik nodig voor mijn template engine.

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Dan heb je dus een array met meerdere regels in een array met meerdere regels die uitgelezen moet worden.
Soort van:
code:
1
2
3
4
5
6
7
foreach(array1 as $record1){
   array1 data laten zien
   array2 = array1["array2data"]
   foreach(array2 as $record2} {
     record2 data laten zien
   }
}

Dat zou ook wel moeten kunnen denk ik. Maar hoe langzaam gaat het dan worden?
Eerst wil ik even die replace zover krijgen dat die en een keer meerdere velden doet. Dat doet het nu een beetje. Niet alles wordt correct gereplaced.

Stoel weet jij of het mogelijk is die template ook nog door PHP te laten parsen zodat je ook PHP code erin kunt gebruiken?
En hoe heb jij includes erin gezet? Het is namelijk handig als je afhankelijk van bijvoorbeeld een booelan de ene of de andere pagina kan includen. Bijvoorbeeld bij een Poll. Dan kun je of de poll laten zien of de uitslag wanneer iemand gestemd heeft.

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Tomato: Ik vermoed alleen dat er dan nog steeds gewoon een x aantal str_replace()'s uitgevoerd wordt.
Ik heb ff de 4.1.2 source bekeken en er zit inderdaad geen ander mechanisme achter, PHP paast alle elementen in het array gewoon 1 voor 1 door de interne str_replace.

Qua snelheid maakt het dus nix uit.

This can no longer be ignored.


  • tomato
  • Registratie: November 1999
  • Niet online
Erik Jan: Ik heb ff de 4.1.2 source bekeken en er zit inderdaad geen ander mechanisme achter, PHP paast alle elementen in het array gewoon 1 voor 1 door de interne str_replace.

Qua snelheid maakt het dus nix uit.
Dat dacht ik al. Toch nog iemand die mijn reply opmerkt ;)

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Doet PHP dan hetzelfde met een str_replace wanneer er twee arrays in zitten? In dat geval hoef ik niet moeilijk te doen en mijn code aan te passen.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 15 april 2002 09:19 schreef Frijns.Net het volgende:
Doet PHP dan hetzelfde met een str_replace wanneer er twee arrays in zitten? In dat geval hoef ik niet moeilijk te doen en mijn code aan te passen.
Vast wel. Het is een van de makkelijkste manieren.

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Ok, bedankt voor de info. Dan weet ik genoeg. Dan ga ik niet verder met arrays prutsen (het is ook prutsen omdat de array meer data bevat dan er tags (kunnen) zijn )
Dan laat ik mijn eigen loop de str_replace uitvoeren.
Pagina: 1