PCRE: Hilfe gesucht
Hallo ihr,
ich scheitere langsam an einer regulaeren Expression. Zur Zeit sieht sie so aus:
Code:
Damit werden in der Template-Engine vom phpBB die Variablen ("{SOMEVAR}") ersetzt. Nachdem ich zur Zeit versuche, If-Bloecke einzubauen und dort auch solche Variablen erlaubt sein sollen, duerfen sie nur ersetzt werden, wenn kein "<!-- IF" direkt davorsteht. Das hier:
$code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', $something, $code);
Code:
hat leider nicht geklappt. weiss jemand vielleicht, wie ich die Expression aufbauen muss, damit das:
$code = preg_replace('#(^<!-- IF )\{([a-z0-9\-_]*?)\}#is', $something, $code);
Code:
zwar ersetzt wird, das hier:
slkdjfsf {SOMEVAR} asdfjk
Code:
aber nicht?
klsdjfa aslfkj
Irgendwie scheitere ich immer an diesen Expressions :wall: Greetz alcaeus |
Re: PCRE: Hilfe gesucht
Ich würde das hier vorschlagen:
Code:
Gehts denn so? :duck:
$code = preg_replace('#^(<!-- IF )\{([a-z0-9\-_]*?)\}#is', $something, $code);
|
Re: PCRE: Hilfe gesucht
Hallo Dax,
vielleicht liegt es auch nur daran, dass ich in diesem Fall nicht mehr \\1 verwenden darf, um mit dem Match zu arbeiten. Ich zeige mal die gesamte Zeile:
Code:
Auf alle Faelle wird bei deiner Loesung leider auch das "<!-- IF " als Match erkannt und deshalb verwendet :(
$code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "\$this->_tpldata['.'][0]['\\1']", $code);
Hast du vielleicht sonst noch irgendwelche Vorschlaege? :gruebel: Greetz alcaeus |
Re: PCRE: Hilfe gesucht
Naja ...
du könntest natürlich auch den Template-Text durchgehen, und dann immer nur alles ausserhalb der Kommmentare durch die Ersetzung schicken, aber das dürfte nicht allzu schnell sein ... Oder aber du verwendest einfach andere Klammern für die If-Abfrage :mrgreen: |
Re: PCRE: Hilfe gesucht
Dann kann ich nur mit if() dienen:
Code:
if(preg_match("#", $code)
|
Re: PCRE: Hilfe gesucht
@Julius: das hab ich schon mal probiert. Auch wenn die Templates gecached werden, das Cachen dauert mehr als 30 Sekunden wenn ich das in jeder Zeile mache :wall:
In $code steht eben der gesamte Text der Template-Datei drin, und es waere eben schoen, wenn ich das in der gleichen Expression machen koennte. Egal, ich zwinge mich jetzt mal durch die PCRE-Doku, jetzt habt ihr eine Weile Ruhe :lol: Greetz alcaeus |
Re: PCRE: Hilfe gesucht
Hmmm ... joa, 30 sek. sind nicht so gut ... :mrgreen:
Du könntest vielleicht so als speedup folgendes machen: Wenn keine speedup (oder wie auch immer) -Datei existiert: Templatetext aufwändig durchsuchen, und eine speedup (oder wie auch immer) -Datei anlegen, in der dann steht:
Code:
also erst die variablennamen und dahinter ihre zu ersetzenden Positionen im Text.
somevar:23,45,87,132
someother:35,75,231 Du musst also dann nicht mehr jedesmal alle Variablen mit preg_replace oder so ersetzen, sondern du öffnest diese speedup-Datei und ersetzt gezielt die notierten Vorkommen. Damit dürfte das ersetzen erheblich schneller gehen (zumindest ab dem 2. mal) und du kannst dich auf deine If-Abfragen konzentrieren ;) Da ein Template ja nicht ständig gewechselt wird, dürfte das ja insgesamt nicht allzuviel Zeit kosten ... |
Re: PCRE: Hilfe gesucht
Hallo!
So geht es bei mir:
Code:
Man muss ein bisschen aufpassen, weil man duch das IF auch ein Leerzeichen mit hinein bekommt.
<?php
$text = "blah blah"; $text = preg_replace('##is', 'BAR', $text); echo $text; ?> Grüße Christian //Edit: Okay, das mit dem Leerzeichen war bei obigen Codes auch in Ordnung. Hatte mich verguckt. ;-) //Edit2: Ist nicht exakt die selbe Ersetzung wie gewünscht, aber wenn ich den Kommentar nicht mit ersetzte, war es so unbequem zu gucken, ob richtig ersetzt wurde :-) Anpassung sollte nicht schwer sein ;-) |
Re: PCRE: Hilfe gesucht
So wie ich das sehe, ist das genau falschrum ^^
raus kommt:
Code:
Ich diagnostiziere: {0} als "darf nicht da sein" funktioniert nicht. ;)
blah <!-- IF BAR blah
bla {FOO} bla2 |
Re: PCRE: Hilfe gesucht
Hi!
ich gehe mal von diesem "Auftrag" aus ;-) Zitat:
Grüße Christian |
Re: PCRE: Hilfe gesucht
Zitat:
das da:
Code:
wird bei deinem Code naemlich auch nicht ersetzt ;)
blah {FOO} blah
Ich studiere mich immer noch durch die PCRE-Doku, aber so langsam kommt mir vor, dass das nicht geht. :-? Ich versuchs mal weiter, falls es nicht klappt, wird das viel Denkarbeit geben, aber erstmal gibts einen grossen Dank fuer eure Hilfe. Falls noch jemandem was einfaellt, koennt ihr es aber trotzdem gerne sagen ;) Greetz alcaeus |
Re: PCRE: Hilfe gesucht
Ja, du hast es nötig :mrgreen:
Bei folgendem Code:
Code:
Kommt das raus:
<?
header ("Content-Type: text/plain"); $text = "blah blah bla {FOO} bla2"; $text = preg_replace('##is', 'BAR', $text); echo $text; ?> Zitat:
Code:
Kommt das raus:
<?
header ("Content-Type: text/plain"); $text = "blah blah bla {FOO} bla2"; $text = preg_replace('#[color=#ff0000](#is', 'BAR', $text); echo $text; ?> Zitat:
Zitat:
|
Re: PCRE: Hilfe gesucht
Hm. Stimmt, das geht nicht. Wenn man den Beginn des Kommentars in das "Du darfst nicht" mir rein nimmt, matcht er zu wenig und ignoriert das einfach. :-(
|
Re: PCRE: Hilfe gesucht
So, ich nehme jetzt einfach den Weg drumrum, und arbeite mit 3 expressions:
Code:
Das ergibt nach dem ersten replace das:
$text = "blah blah {SOMEVAR}";
$text = preg_replace('##is', '_special_if_\\1', $text); $text = preg_replace('#\{([a-z0-9\-_]*?)\}#is', 'BAR', $text); $text = preg_replace('#_special_if_([a-z0-9\-_]+)#is', '', $text);
Code:
Nach dem zweiten:
blah _special_if_FOO blah {SOMEVAR}
Code:
Und nach dem dritten kommt das raus:
blah _special_if_FOO blah BAR
Code:
Funktioniert perfekt, vielen Dank fuer eure Hilfe :)
blah blah BAR
Greetz alcaeus |
Re: PCRE: Hilfe gesucht
Es gibt dann aber ein Problem, wenn "_special_if_FOO" im Ausgangstext auftaucht :stupid:
In dieser Hinsicht wäre es vielleicht besser, die ifs mit preg_match_all zu finden und zu entfernen, dann die Variablen zu ersetzen, und danach die ifs wieder erinzufügen :angel2: |
Re: PCRE: Hilfe gesucht
Moin Julius,
ja, da hast du (vielleicht) Recht. Nachdem ich aber selbst die Template-Variablen bestimme, hab ich das Problem nicht *g* Ich arbeite zur Zeit aber noch an einer erweiterten Version der Expression, um auch verschachtelte Ausdruecke unter Verwendung mehrerer Variablen zuzulassen ;) Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz