kleines problem mit preg_match_all
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ansatz
ausschnitt
bezeichnung
blocken
check
code
datei
ende
ergebnis
ersetzen
feststelle
funktion
gedanke
klammern
platzhalter
problem
schleife
stadium
start
suche
-
hallo,
ich schreibe derzeit an einer kleinen template klasse. :)
klappt derzeit ganz gut.
bin jetzt in dem stadium angekommen, indem ich die schleife schreibe für die platzhalter, die mehrmals angezeigt werden sollen.
dachte mir, ich verwende mal schnell die blocktechnik...^^
um das ganze mal zu erläutern:
so ruf ich die funktion auf:
$neu = new template($template); $neu->block_erkennen("BEZEICHNUNG"); ...
das ist die funktion:
public function block_erkennen($name) { $suche = '/{(.*):'.$name.'}(.*)/'; preg_match_all($suche, $this->inhalt, $bloecke, PREG_PATTERN_ORDER); foreach ($bloecke as $block) { foreach ($block as $key => $value) { echo $key." ".$value."<br>"; } } }
der echo befehl ist derzeit für testzwecke... der kommt schon noch weg ^^
derzeit liefert er mir dieses ergebnis:
0 {START:BEZEICHNUNG}
1
0 {ENDE:BEZEICHNUNG}
1
0
1
meine template-datei sieht so aus (nur ein ausschnitt, von der betroffenen stelle)
<div id="content_left"> {START:BEZEICHNUNG} {BEZEICHNUNG}<br /> {ENDE:BEZEICHNUNG} </div>
so mein gedanke:
Wenn ich START und ENDE ermittelt habe (was ich ja habe) müsste ich die {BEZEICHNUNG} auch noch irgendwie rauskriegen...
und hier liegt mein problem:
$suche = '/{(.*):'.$name.'}(.*)/';
ich check das nicht mit den ganzen / ... ^^
[php]$suche = '{START:'.$name.'}(.*){ENDE:'.$name.'}';[/php]
wenn es so gehen würde, müsste ja als ergebnis sowas ähnliches kommen:
0 {START:BEZEICHNUNG}
1 {BEZEICHNUNG}
0 {ENDE:BEZEICHNUNG}
oder irre ich mich?
mein gedanke wäre gewesen:
wenn ich das habe, kann ich mittels mysql_num_rows die anzahl der einträge feststellen (z.b. 5 news-einträge = 5 mal ersetzen)
und dafür hätte ich eine neue funktion geschrieben, die dann den bereich sooft ersetzt, wie num_rows ausgespruckt hat ;)
hoffe könnt mir irgendwie folgen^^
mein problem wäre es also, die richtige syntax für den string für die suche zu finden.... =(
etwas würde mich noch interessieren:
was meint ihr soweit zu meinen überlegungen bzw. dem gedanken für das ersetzen des platzhalters?^^
habe für einzelne werte wie z.b.den seitentitel oder das datum auch eine funktion, die auf keine schleife angewiesen ist.
Wie müsste also die Syntax für den Suchstring lauten, um folgendes Ergebnis zu erhalten:
0 {START:BEZEICHNUNG}
1 {BEZEICHNUNG}
0 {ENDE:BEZEICHNUNG}
vielen dank!
gruß
skull
Beitrag geändert: 17.9.2008 12:28:28 von skullsplitter
Beitrag geändert: 17.9.2008 12:29:43 von skullsplitter -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Dein Ansatz ist nicht so falsch, aber leider zu einfach gedacht.
<? $suche = '/{(.*):'.$name.'}(.*)/'; ?>
geht so nicht.
Ich verwende ganz gerne doppelte Anführungsstriche für RegEx, da man dann keine Probleme mit eventuellen Variablen bekommt. Als Start- und Endbegrenzer nehme ich ~, da dieses Zeichen so gut wie nie vorkommt. Wären wir also bei
<? $suche = "~{(.*):$name}(.*)~"; ?>
Als nächstes kannst du { und } nicht im Ausdruck verwenden ohne sie zu escapen (mit Backslashes, falls lima die verschluckt^^), da dieses Klammern für erlaubte Zeichensets reseviert sind. Außerdem willst du ja den Block zwischen Start:Bezeichnung und Ende:Bezeichng haben, somit kommen wir zu:
<? $suche = "~\{START:$name\}(.*)\{ENDE:$name\}~"; ?>
Ich hab das jetzt nicht getestet, mein Gefühl sagt mir aber, das das so stimmen sollte. Es könnte sein, dass die Doppelpunkte auch noch escaped werden müssen und zum Schluss würde ich noch mit ein paar Modifiern (Usim) rumspielen. Somit war dein Gedanke $suche = '{START:'.$name.'}(.*){ENDE:'.$name.'}'; schon gar nicht so falsch.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage