[PHP] Regular Expressions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Ik ben bezig aan een CMS systeem, en ik wil wat extra functies voor de 'content' velden. Ik zou graag dynamische dingen kunnen weergeven, bijvoorbeeld:
code:
1
2
3
4
[%echo=ip%]
[%echo=lastvisit%]
[%listchildren%]
[%mailform=bla@bla.com,naam,email,bericht%]

Allemaal zaken die vervolgens gereplaced moeten worden.
Ik weet wel hoe ik met reg_exps de (iets als [%[ *]%] ) de stukken moet vinden, maar is er ook een handige manier om vervolgens de stukken tussen de [% en %] naar een PHP-functie te sturen?
dus, vervang alle [%$iets%] door de output van de PhpFunctie($iets) .
Phpfunctie() is dan een phpfunctie waarin ik definieer wat er met echo= en mailform= etc. moet gebeuren.

Ik zou het wel kunnen fixen via een lange weg: eerst locatie zoeken van [%, dan van %], dan via substr (of zo) de tekst ertussen selecten, die uitvoeren met PHPfunctie() en dan weer een Replace doen met [%......%] maar dat vind ik niet zo netjes.

[ Voor 19% gewijzigd door mocean op 26-03-2003 00:13 ]

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Met de functie preg_replace() kan je direct een functie aanroepen:

voorbeeldje:
PHP:
1
2
3
4
5
6
7
8
function parse_text($text) {
  //-- doe je ding
}

$regexp = "/[%(.*)%]/e"; #weet niet of deze werkt..
$replace = "parse_text($1)";

$content = preg_replace($regexp, $replace, $content);


[disclaimer: niet getest]

[ Voor 16% gewijzigd door thomaske op 26-03-2003 00:13 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De /e parameter bij preg_replace kan dat ja.

Ala:
PHP:
1
preg_replace('/([^ ]*)/e', 'print(\'\1\' . "\n")', "tekstje voor test");

Ah en ik ben alweer te laat :P

[ Voor 11% gewijzigd door ACM op 26-03-2003 00:14 ]


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
thomaske, gaat ie dan niet gewoon letterlijk 'parse_text($1)' als string invoegen in de $content ?
ik ga ff testen...

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
ACM schreef op 26 March 2003 @ 00:14:
De /e parameter bij preg_replace kan dat ja.

Ala:
PHP:
1
preg_replace('/([^ ]*)/e', 'print(\'\1\' . "\n")', "tekstje voor test");

Ah en ik ben alweer te laat :P
Kan ik 'print(\'\1\' . "\n")' dan vervangen door 'phpfunctie(\'\1\')' ?

ik zie niet goed waarom er 3x geescaped moet worden....

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

mocean schreef op 26 March 2003 @ 00:20:
Kan ik 'print(\'\1\' . "\n")' dan vervangen door 'phpfunctie(\'\1\')' ?
Ja.
ik zie niet goed waarom er 3x geescaped moet worden....

waarom niet :?
echo '''; dan snap je waarom de ' geescaped worden.
en \1 is geen geescapede 1 maar gewoon de 1e variabele die uit de match komt, je kan evt ook $1 schrijven, maar \1 levert minder gedoe op en werkt in alle preg-versies.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 26 maart 2003 @ 00:32:
waarom niet :?
echo '''; dan snap je waarom de ' geescaped worden.
en \1 is geen geescapede 1 maar gewoon de 1e variabele die uit de match komt, je kan evt ook $1 schrijven, maar \1 levert minder gedoe op en werkt in alle preg-versies.
$x werkt al vanaf PHP versie 4.0.4; als je een oudere versie PHP gebruikt mag je je wel eens achter je oren gaan krabben ;)
offtopic:
ga je nog iets met mijn code voor code doen? :)

[ Voor 9% gewijzigd door crisp op 26-03-2003 00:41 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

crisp schreef op 26 March 2003 @ 00:40:
$x werkt al vanaf PHP versie 4.0.4; als je een oudere versie PHP gebruikt mag je je wel eens achter je oren gaan krabben ;)
Mja, ik doelde ook meer op regexp-libs als die in vim, perl etc :)
Bijna allemaal snappen ze de \x wel, maar niet altijd de $x. Alhoewel er ook wel libs zijn die juist de \x niet snappen en de $x wel
offtopic:
ga je nog iets met mijn code voor code doen? :)

Tuurlijk :)

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Gebruik anders een template parser! Daarmee kun je heel handig (zeker voor CMS'en) de layout van de code scheiden. Degene die de layout maakt hoeft zo geen regel PHP aan te raken! Ik heb zelf een stackbased-template-parser geschreven (dus eentje waaarin het mogelijk is om foreach-loops te maken en die zelfs te nesten, met if's en else's te werken enzo) en je kunt ermee spelen op http://dev.trag.nl/ccbv/include/tpltest.php . Verder kun je wat demotemplates die ik gebruik op sites bekijken op www.bkvdenbosch.nl/templates/ en je kunt de parser zelf downloaden op www.codebase.nl :) Scheelt je een hoop werk, is een stuk handiger en snel genoeg :)

oww, ff snel een voorbeeldje zodat je dat kan testen:
code:
1
2
3
4
5
6
7
8
9
[foreach array="narr" as="blaat"]
%blaat%
[if expr="%blaat%==1"]
<b><u>1</u></b>
[else]
<i>%blaat</i>
[/else]
[/if]
[/foreach]


Dit simpele template'je krijgt van jouw PHP files een array mee (daarvoor is een functie addTemplateVar) en daar gaat hij door heen, en zet steeds de waarde in %blaat%. Met de if zorg je ervoor dat als %blaat% 1 is dat die 1 dan bold en onderstreept op het scherm verschijnt. De andere vars (in het else blok) die worden cursief weergegeven :) Je snapt hopelijk dat je bijvoorbeeld zo op een CMS site een lijst met pagina's in een array kunt stouwen en daar dan doorheen kunt foreachen om zo de links daarheen te printen :)

De syntax is verder heel simpel gehouden, en door de opbouw is het mogelijk om de ene foreach in de andere te hebben :)

[ Voor 53% gewijzigd door MisterData op 26-03-2003 08:17 ]


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
MisterData schreef op 26 maart 2003 @ 08:13:
Gebruik anders een template parser! [...]
Dat is wel een goed idee! Ik ga er vandaag naar kijken!

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
smarty ( http://smarty.php.net ) ziet er zeer goed uit! en er zijn ook al veel topics over :)

Koop of verkoop je webshop: ecquisition.com

Pagina: 1