[php] regular expressions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben momenteel bezig met het bouwen van een template class welke als input templates bevatten die er ong. zo uit zien:

<body>
{{blok}}
{sql_blok1}
{sql_blok2}
{sql_blok3}
{{blok}}
</body>

Nu wil ik in de classe de mogelijkheid inbouwen om alle blokken te verwijderen, hiervoor heb ik de volgende ereg_replace gemaakt.

$this->temp = ereg_replace("({{)(.*)(}})", "", $this->temp);
$this->temp = ereg_replace("({)(.*)(})", "", $this->temp);

Helaas werkt deze ereg niet goed. De laatse ereg die de sql blokken verwijderd ( {sql_blok} ) verwijderd niet alleen de sql blok maar ook alles wat er verder onder staat (bijv. </body> ). Iemand enig idee wat ik fout doe en hoe de eregs er wel uit moeten zien ?

Alvast bedankt voor de (eventuele) antwoorden :)

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

Misschien eens proberen met preg_replace()

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik weet nu iets beter waar het fout gaat. Als ik bijv. 1 blok wil verwijderen ( dus {{blok}} ) dan gaat het goed, maar als ik 2 blokken heb, 1 helemaal boven en 1 helemaal onderaan dan blijft er niks van de template over. Dit komt denk ik omdat de expression de eerste brackets ( {{ ) pakt van het eerste blok en de laatste brackets ( }} ) van het laatste blok en dat replaced door "" (niks). Wat ik wil is dat gewoon alle blokken afzonderlijk worden verwijderd en niet wat er buiten staat. Dus ik wil bijv. verwijderen {{blok1}} en {{blok2}} maar niet </body> enz.

Acties:
  • 0 Henk 'm!

Verwijderd

probeer dit dan eens:

code:
1
2
$this->temp = ereg_replace("({{)(.*?)(}})", "", $this->temp); 
$this->temp = ereg_replace("({)(.*?)(})", "", $this->temp);


of

code:
1
2
$this->temp = ereg_replace("({{)(.*)?(}})", "", $this->temp); 
$this->temp = ereg_replace("({)(.*)?(})", "", $this->temp);


Weet niet meer welke het was :D

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De eerste code geeft een foutmelding, namelijk:


Warning: REG_BADRPT:trepetition-operator operand invalid in C:\apache\htdocs\welkomin\classes\inc.template.class on line 127

Warning: REG_BADRPT:trepetition-operator operand invalid in C:\apache\htdocs\welkomin\classes\inc.template.class on line 128

En de 2de doet helaas hetzelfde als mijn code, de code verwijderd wel bijv. het eerste blok in de template, bijv. ( {{test}} ) maar als ik helemaal onderaan of ergens in het midden nog een blok zet, bijv. ( {{test2}} ) dan verwijderd de ereg tot daar alle code. Alvast bedankt in elk geval voor je hulp, als je misschien nog iets weet heel graag :)

Acties:
  • 0 Henk 'm!

Verwijderd

De eerste versie: (.*?)

Een modifier gevolgd door een vraagteken is ungreedy, ook de combinaties +? en ?? zijn mogelijk, maar komen minder vaak voor.

Als er (.*)? zou staan, dan heeft het vraagteken eigenlijk helemaal geen nut, aangezien (.*) altijd matcht.

Acties:
  • 0 Henk 'm!

Verwijderd

en

code:
1
2
$this->temp = preg_replace("({{)(.*?)(}})", "", $this->temp); 
$this->temp = preg_replace("({)(.*?)(})", "", $this->temp);


??

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 28 December 2002 @ 19:48:
en

code:
1
2
$this->temp = preg_replace("({{)(.*?)(}})", "", $this->temp); 
$this->temp = preg_replace("({)(.*?)(})", "", $this->temp);


??
Als je pregreplace doet, moet je dit doen:

PHP:
1
2
$this->temp = preg_replace("/({{)(.*?)(}})/", "", $this->temp); 
$this->temp = preg_replace("/({)(.*?)(})/", "", $this->temp);

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 28 december 2002 @ 19:51:
[...]


Als je pregreplace doet, moet je dit doen:
Daar heb je helemaal gelijk in

Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 15-07 09:34

PrinsEdje80

Holographic, not grated...

Maar die zou wel moeten werken!

Used to be Down Under... Foto gallery


Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Tis alelen niet de snelste versie! Volgens mij is de snelste ([a-z]+?)

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

Verwijderd

prog-konijn schreef op 29 December 2002 @ 11:03:
Tis alelen niet de snelste versie! Volgens mij is de snelste ([a-z]+?)
Ja die zal wel sneller zijn, maar denk niet dat ie dat wil, aangezien je hiermee een groot deel characters gaat negeren ;) (.*?) lijkt me toch beter imo.
Pagina: 1