PHP: Regulärer Ausdruck: Gefundene Werte in Variable
telofon
- programmiertechnik
Hallo.
in meinem RegEx wird [2=Meine Tante] zu "<h2>Meine Tante</h2>", und [1=Überschrift] zu "<h1>Überschrift</h1>". Funktioniert zufriedenstellend.
Wie ihr erkennt, werden daraus Überschriften gefertigt. Wie kann ich anhand dieser Überschriften ein Inhaltsverzeichnis erzeugen, wie das MediaWiki in den geschrieben Artikeln macht?
Dazu bräuchte ich ja die Zahl (im Beispiel oben "2" oder "1") und den String zwischen = und ] . Ich habe aber keine Ahnung, wie ich diese Werte herausholen und in eine Variable/Array speichern kann.
Grüße
telofon
Hi,
Dazu bräuchte ich ja die Zahl (im Beispiel oben "2" oder "1") und den String zwischen = und ] .
Wo genau liegt Dein Problem? Kennst Du die Methoden nicht, oder weisst Du nicht, wie die regEx aussehen soll?
//suche nach "[" gefolgt von Zahlen, gefolgt von "=", gefolgt von irgendwelchen Zeichen bis zum nächsten Auftreten von "]".
$reg = "/[([0-9]+)=(.+?)]/";
if (preg_match($reg, $string, $matches)) {
echo $matches[1] . "<br>";
echo $matches[2];
}
Gruesse, Joachim
if (preg_match($reg, $string, $matches)) {
echo $matches[1] . "<br>";
echo $matches[2];
}
Warum will das Inhaltsverzeichnis keine Liste mit mehreren Ebenen sein?
Hi,
Warum will das Inhaltsverzeichnis keine Liste mit mehreren Ebenen sein?
Das ist doch bloss eine Testausgabe wie geklammerte Matches ausgegeben werden können... nu bleib ma locker ;-)
Gruesse, Joachim
Das ist doch bloss eine Testausgabe wie geklammerte Matches ausgegeben werden können... nu bleib ma locker ;-)
Wenn ich in der Vergangenheit für jedes "das ist nur zum Testen"[1] einen Euro bekommen hätte, könnte ich mir jetzt bereits eine Kiste Bier kaufen.
[1] welches letztendlich dann im Produktivsystem nicht geändert wurde und trotzdem $testvar hiess ;)
Hallo
//suche nach "[" gefolgt von Zahlen, gefolgt von "=", gefolgt von irgendwelchen Zeichen bis zum nächsten Auftreten von "]".
$reg = "/[([0-9]+)=(.+?)]/";
if (preg_match($reg, $string, $matches)) {
echo $matches[1] . "<br>";
echo $matches[2];
}
Da war ich wohl ein bisschen vorschnell. An preg_match habe ich gar nicht gedacht, habe immer direkt mit preg_replace ersetzt.
Beispielsatz: "Gestern war ich in [1=Bremen] und habe meine [2=Tante] besucht..."
RegEx:
preg_match_all("~\[([0-4])=([[:graph:]]+)\]~", $text, $matches);
print_r($matches);
Ausgabe:
Array
(
[0] => Array
(
[0] => [1=Bremen]
[1] => [2=Tante]
)
[1] => Array
(
[0] => 1
[1] => 2
)
[2] => Array
(
[0] => Bremen
[1] => Tante
)
)
Soweit sieht das doch ganz ordentlich aus. Für das Inhaltsverzeichnis muss PHP jetzt allerdings wissen, dass "Tante" ein Unterobjekt von "Bremen" ist. Wie könnte ich das bewerkstelligen?
Gruß
telofon
Soweit sieht das doch ganz ordentlich aus. Für das Inhaltsverzeichnis muss PHP jetzt allerdings wissen, dass "Tante" ein Unterobjekt von "Bremen" ist. Wie könnte ich das bewerkstelligen?
Mit einer rekursiven Schleife.
[1=Ueberschrift]
[1=Ueberschrift]
[2=Drunter]
[3=tiefer]
[2=wieder raus]
[1=Ueberschrift]
[1=Ueberschrift]
Werkle dich solange durch, bis ein Gruppenwechsel stattfindet, dann startet die Schleife selbst (natürlich ein Funktion) eine Ebene tiefer neu solange bis ein Gruppenwechsel stattfindet oder die Ebene zuende ist.
Hallo
Mit einer rekursiven Schleife.
Also ich habe jetzt schon die ganze Zeit versucht, das hinzubekommen. Ich kenne das Prinzip und weiß auch wie ich den Code dann zu lesen habe. Aber ich kann das alles nicht auf diesen Anwendungszweck übertragen. Kannst du mir vielleicht einen kleinen Denkanstoß geben? Oder vielleicht sogar einen kleinen Codeausschnitt?
Gruße
telofon
Hallo
Mit einer rekursiven Schleife.
Also ich habe jetzt schon die ganze Zeit versucht, das hinzubekommen. Ich kenne das Prinzip und weiß auch wie ich den Code dann zu lesen habe. Aber ich kann das alles nicht auf diesen Anwendungszweck übertragen. Kannst du mir vielleicht einen kleinen Denkanstoß geben? Oder vielleicht sogar einen kleinen Codeausschnitt?
Gruße
telofon
Du solltest die Daten noch in eine andere Form transportieren, damit du damit besser umgehen kannst, etwa so:
Array
(
0 => Array
(
0 => 1
1 => foo
)
1 => Array
(
[0] => 1
[1] => foo baz
)
2 => Array
(
[0] => 2
[1] => foo bar
)
)
Dreckige Variante mit flacher Schleife:
Du gehst in einer Schleife durch und gibst Elemente aus:
echo '<li>' . $arr[$i][1]';
Wenn der nächste eintrag dieselbe Ebene hat wie der derzeitige, gibst du ein schließendes li-Element aus, wenn nicht gibst du ein öffnendes <ul>-Element aus.
Wenn der vorherige Eintrag größer war als der derzeitige gibst du ein schließendes <ul> und ein schließendes <li>-Element aus.
Etwaige Denkfehler meinerseits vorbehalten :)
Hallo
Array
(
0 => Array
(
0 => 1
1 => foo
)1 => Array
(
[0] => 1
[1] => foo baz
)2 => Array
(
[0] => 2
[1] => foo bar
)
)
In dieser Form habe ich mein Array gebracht (ist ja auch kaum ein Problem). Ich stürze hier aber von einer Problematik in die andere...
Also diese Arraystruktur wie oben speichere ich in eine Klassen-Variable "tree".
Und rufe dann die Methode "recurs" auf (parameterlos):
function recurs()
{
echo "\n<ol>\n";
foreach($this->tree as $ast)
{
echo "<li>".$ast[1];
if($ast[0]>1) $this->recurs();
echo "</li>";
}
echo "</ol>";
}
Natürlich funktioniert das nicht. Denn jedesmal wenn die Schleife neu aufgerufen wird, beginnt die Schleife wieder mit dem ersten Element.
Ich stehe aber nun auf dem Schlauch und weiß nicht wie ich das umgehen kann. Oder habe ich das mit der rekursiven Schleife nicht richtig verstanden/umgesetzt?
Gruß
telofon
Natürlich funktioniert das nicht. Denn jedesmal wenn die Schleife neu aufgerufen wird, beginnt die Schleife wieder mit dem ersten Element.
Oder habe ich das mit der rekursiven Schleife nicht richtig verstanden/umgesetzt?
Prinzipiell ja - aber mein letztes Beispiel bezog sich auf die "dreckige Lösung ohne Rekursion" - das sollte völlig ausreichen.
Eine for-Schleife mit der Länge des Arrays oder einen Zählervariable für die foreach-Schleife muss da allerdings - oder du hangelst dich mit next(), prev() und current() durchs array.