preg_match() - reguläre Ausdrücke verarbeiten
Thomas
- php
0 Cheatah0 Rato Micefarmer0 Thomas
Hi!
Ich hab ne Funktion:
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
Gedacht wäre, dass $1 dem regulären Ausdruck (.*) entspricht, was is daran falsch?
thx
Thomas
Hi,
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
Gedacht wäre, dass $1 dem regulären Ausdruck (.*) entspricht, was is daran falsch?
daran ist falsch, dass "[(.*)]" auf ein(!) Zeichen matcht, welches "(", ".", "*" oder ")" ist.
Cheatah
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
Du gibst also an, dass in '$text' der Rückgabewert von 'preg_match()', der entweder 0 oder 1 ist, gespeichert wird, und gleichzeitig willst du in '$text' den Treffer speichern lassen.
Gedacht wäre, dass $1 dem regulären Ausdruck (.*) entspricht, was is daran falsch?
Genau das, was Cheatah schon geschrieben hat. Wenn wirklich beabsichtigt ist, das der Subpattern '(.*)' den Inhalt von '$1' enthält (nur nebenbei, ein Variablenname darf nicht mit einer Zahl beginnen), so wirst du diesen ändern müssen. Denn dieser Subpattern würde, wenn er nicht in einer Zeichenklasse stände, auf jedes mögliche Zeichen matchen. Aufgrund des '*' nach dem '.' und der Tatsache, dass dieser Regex ungready ist, würde dieser Subpattern einen leeren String zurückliefern.
mfg
Rato
Hi!
Eigentlich meinte ich folgendes:
$text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
nach preg_match sollte dann folgendes stehn:
$text = "Hier steht ein Text mit einem Link zur Person <a href="[hostname]/Hubert">Hubert</a>.";
=> vor [ und ] gehört ein Backslash, aber was stimmt da immer noch nicht?
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
Danke
Thomas
Hallo Thomas.
Eigentlich meinte ich folgendes:
$text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
nach preg_match sollte dann folgendes stehn:
$text = "Hier steht ein Text mit einem Link zur Person <a href="[hostname]/Hubert">Hubert</a>.";=> vor [ und ] gehört ein Backslash, aber was stimmt da immer noch nicht?
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
1. Du meinst vermutlich eigentlich preg_replace. Ansonsten würdest du mit obigem Kommando das Ergebnis der Ersetzung als Array in $text ablegen und dies sogleich darauf wieder verwerfen, da du in die gleiche Variable den Rückgabewert von preg_match hineinschreiben lässt.
2. Rückreferenzen im Ersatzstring gehören zu diesem und sind keine plötzlich definierten Variablen
3. Du übernimmst den gesamten Inhalt der eckigen Klammern, ohne den Namen zu extrahieren.
Zusammenfassend also:
$text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
$text = preg_replace('!\[name=(.*)\]!U',
'<a href="[hostname]/$1">$1</a>', $text);
echo $text; // Hier steht ein Text mit einem Link zur Person <a href="[hostname]/Hubert">Hubert</a>.
Einen schönen Montag noch.
Gruß, Mathias
Hallo nochmal.
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
- Du meinst vermutlich eigentlich preg_replace. Ansonsten würdest du mit obigem Kommando das Ergebnis der Ersetzung als Array in $text ablegen und dies sogleich darauf wieder verwerfen, da du in die gleiche Variable den Rückgabewert von preg_match hineinschreiben lässt.
An meinem Vorschlag ändert sich nichts, aber meine Anmerkung ist Quark. Dazu hätte $text sowohl das zweite als auch das dritte Argument für preg_match sein müssen.
Einen schönen Montag noch.
Gruß, Mathias
Hi,
$text = "Hier steht ein Text mit einem Link zur Person [name=Hubert].";
nach preg_match sollte dann folgendes stehn:
preg_match ändert den zu prüfenden String nicht.
=> vor [ und ] gehört ein Backslash, aber was stimmt da immer noch nicht?
$text = preg_match("=[(.*)]=U", '<a href="[hostname]/'.$1.'">'.$1.'</a>', $text);
Du willst etwas ersetzen (replace), nicht nur finden (match).
cu,
Andreas