Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PCRE: Hilfe gesucht (https://www.delphipraxis.net/49301-pcre-hilfe-gesucht.html)

alcaeus 8. Jul 2005 16:19


PCRE: Hilfe gesucht
 
Hallo ihr,

ich scheitere langsam an einer regulaeren Expression. Zur Zeit sieht sie so aus:
Code:
$code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', $something, $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:
$code = preg_replace('#(^<!-- IF )\{([a-z0-9\-_]*?)\}#is', $something, $code);
hat leider nicht geklappt. weiss jemand vielleicht, wie ich die Expression aufbauen muss, damit das:
Code:
slkdjfsf {SOMEVAR} asdfjk
zwar ersetzt wird, das hier:
Code:
klsdjfa aslfkj
aber nicht?
Irgendwie scheitere ich immer an diesen Expressions :wall:

Greetz
alcaeus

Dax 8. Jul 2005 16:22

Re: PCRE: Hilfe gesucht
 
Ich würde das hier vorschlagen:
Code:
$code = preg_replace('#^(<!-- IF )\{([a-z0-9\-_]*?)\}#is', $something, $code);
Gehts denn so? :duck:

alcaeus 8. Jul 2005 16:29

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:
$code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "\$this->_tpldata['.'][0]['\\1']", $code);
Auf alle Faelle wird bei deiner Loesung leider auch das "<!-- IF " als Match erkannt und deshalb verwendet :(
Hast du vielleicht sonst noch irgendwelche Vorschlaege? :gruebel:

Greetz
alcaeus

jfheins 8. Jul 2005 16:35

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:

Dax 8. Jul 2005 16:36

Re: PCRE: Hilfe gesucht
 
Dann kann ich nur mit if() dienen:
Code:
if(preg_match("#", $code)

alcaeus 8. Jul 2005 16:39

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

jfheins 8. Jul 2005 16:49

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:
somevar:23,45,87,132
someother:35,75,231
also erst die variablennamen und dahinter ihre zu ersetzenden Positionen im Text.
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 ...

Christian S. 8. Jul 2005 16:55

Re: PCRE: Hilfe gesucht
 
Hallo!

So geht es bei mir:
Code:
<?php

$text = "blah blah";

$text = preg_replace('##is', 'BAR', $text);

echo $text;

?>
Man muss ein bisschen aufpassen, weil man duch das IF auch ein Leerzeichen mit hinein bekommt.

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 ;-)

jfheins 8. Jul 2005 17:12

Re: PCRE: Hilfe gesucht
 
So wie ich das sehe, ist das genau falschrum ^^

raus kommt:
Code:
blah <!-- IF BAR blah
bla {FOO} bla2
Ich diagnostiziere: {0} als "darf nicht da sein" funktioniert nicht. ;)

Christian S. 8. Jul 2005 17:15

Re: PCRE: Hilfe gesucht
 
Hi!

ich gehe mal von diesem "Auftrag" aus ;-)

Zitat:

Zitat von alcaeus
weiss jemand vielleicht, wie ich die Expression aufbauen muss, damit das:
Code:
slkdjfsf {SOMEVAR} asdfjk
zwar ersetzt wird, das hier:
Code:
klsdjfa aslfkj
aber nicht?

Das macht doch mein obiges Beispiel oder habe ich das Wochenende wirklich so dringend nötig? :gruebel:

Grüße
Christian

alcaeus 8. Jul 2005 17:19

Re: PCRE: Hilfe gesucht
 
Zitat:

Zitat von Christian S.
Das macht doch mein obiges Beispiel oder habe ich das Wochenende wirklich so dringend nötig? :gruebel:

Ja, hast du :lol:

das da:
Code:
blah {FOO} blah
wird bei deinem Code naemlich auch nicht ersetzt ;)

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

jfheins 8. Jul 2005 17:22

Re: PCRE: Hilfe gesucht
 
Ja, du hast es nötig :mrgreen:

Bei folgendem Code:
Code:
<?

header ("Content-Type: text/plain");

$text = "blah blah
bla {FOO} bla2";

$text = preg_replace('##is', 'BAR', $text);

echo $text;

?>
Kommt das raus:
Zitat:

blah blah
bla {FOO} bla2
Und mit diesem (leicht abgeändertem) Code:
Code:
<?

header ("Content-Type: text/plain");

$text = "blah blah
bla {FOO} bla2";

$text = preg_replace('#[color=#ff0000](#is', 'BAR', $text);

echo $text;

?>
Kommt das raus:
Zitat:

blah <!-- IF BAR blah
bla {FOO} bla2
Alci will das aber so:
Zitat:

blah blah
bla BAR bla2
(Doppelt hält besser, nicht wahr alci ? :mrgreen: )

Christian S. 8. Jul 2005 17:36

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. :-(

alcaeus 8. Jul 2005 17:39

Re: PCRE: Hilfe gesucht
 
So, ich nehme jetzt einfach den Weg drumrum, und arbeite mit 3 expressions:
Code:
$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);
Das ergibt nach dem ersten replace das:
Code:
blah _special_if_FOO blah {SOMEVAR}
Nach dem zweiten:
Code:
blah _special_if_FOO blah BAR
Und nach dem dritten kommt das raus:
Code:
blah blah BAR
Funktioniert perfekt, vielen Dank fuer eure Hilfe :)

Greetz
alcaeus

jfheins 8. Jul 2005 19:01

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:

alcaeus 8. Jul 2005 19:03

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