Erweitertes Replace in PHP

T

tux.ICBlood

Guest
Ich habe mir selbst ein art kleines bbcode geschrieben.
Für Links sieht das dann so aus.
CODE $text=str_replace("[link \"","<a href=\"",$text);
$text=str_replace("[/link]","</a>",$text);
$text=str_replace("\"]","\">",$text);


Dieser Code ist also in der Lage
[link "page.php?id=1"]Test[/link] in <a href="page.php?id=1">Test</a> umzuwandeln.

Jetzt möchte ich aber dynamischer werden, so dass das Script [link "*.php?*"] in <a href="*.php?*&cat=1"> und [link "*.php"] in <a href="*.php?cat=1"> umwandelt. (Die * sollen alles mögliche sein.)

Gruß Daniel
 
hi daniel!

so etwas ist am effektivsten mit regulären ausdrücken zu realisieren!

http://www.regular-expressions.info/tutorial.html

auch wenn es anfangs sehr anstrengend sein kann, hinter die logik zu kommen, kann ich dir nur empfehlen, reguläre ausdrücke zu erlernen, du wirst sie immer wieder und in jeder programmiersprache, unix shells etc. wiederverwenden können!
smile.gif


sehr hilfreich beim erstellen solcher ausdrücke ist ein freeware tool, welches ich hier vorstelle:

http://www.ayom.com/topic-6708.html

gruss josh
 
Ich muss hinter jeden interen Link der auf eine .php Seite verweist den Paramter cat=$cat setzten. Allerdings habe ich zwei verschiedene .php Links. manche habe schon Paramter also zb page.php?id=1 In dem Falle muss die Funktion nur noch &cat=$cat anfügen. Manche php Seiten haben aber noch kein ? am Ende. Dort muss das Script ?cat=$cat anfügen.

Ich möchte also mit der Funktion erstmal erkennen ob es ein interner Link ist (Also nicht mit http:// anfängt) Dann ob es eine php seite ist. (Ich benutze nur die Endung .php) Und dann, ob schon Parametar bzw. ein ? vorhanden ist.

Ich würde mich freuen wenn ihr mir helfen könntet.

Schon mal im Voraus Danke.
 
QUOTE so dass das Script [link "*\.php\?.*\"] in <a href="*.php?*&cat=1"> und [link "*.php"] in <a href="*.php?cat=1"> umwandelt. (Die * sollen alles mögliche sein.)



QUOTE auch wenn es anfangs sehr anstrengend sein kann, hinter die logik zu kommen, kann ich dir nur empfehlen, reguläre ausdrücke zu erlernen, du wirst sie immer wieder und in jeder programmiersprache, unix shells etc. wiederverwenden können!

!!!

$asdf = preg_replace("/\[link \"([^http:\/\/]*\.php\?.*)\"\](.*)\[\/link\]/U", "<a href=$1&cat=1>$2</a>", $txt);
$nachher = preg_replace("/\[link \"([^http:\/\/]*\.php)\"\](.*)\[\/link\]/U", "<a href=$1?cat=1>$2</a>", $asdf);

eigentlich müsstest Du jetzt noch alle restlichen Links umwandeln
$tmpl = preg_replace("/\[link \"(.*)\"](.*)\[\/link\]/U", "<a href=$1>$2</a>", $nachher);

Gut eigentlich ist es ganz einfach: http://ch2.php.net/preg_replace
das suchmuster: "/\[link \"([^http:\/\/]*\.php\?.*)\"\](.*)\[\/link]/U"
" Anführungszeichen wie bei String
/ beginnt das Suchmuster
\[link Die eckige Klammer muss escaped werden \ da sie für Zeichenklassenbenutzt wird
\"(.*)\" d.h. escapte " und darin ist (.*) Punkt steht für egal und * für 0 bis unendlich mal, d.h. alles oder nichts zwischen "
([^http:\/\/]*\.php\?.*)\" ist etwas komplizierter [^http://] ^ in ZKlasse heisst darf nicht kommen * heisst wieder 0-unendilch mal nicht http:// dann \.php der Punkt muss escapedwerden (in diesem fall ist noch \?.* d.h. ein ? und irgendwas dahinter) dann die Klammer geschlossen und das \"
\] der Rest von [link ""]
(.*) irgendetwas, der Linktext
\[\/link\] d.h. [/link], wobei die Klammern und der Slash escaped werden müssen.
/ endet das Suchmuster, wobei /U für ungreedy, nicht gierig steht, dh er nimmt die kleinstmöglich passende auswahl.
Der Ersetztesxt
<a href=$1&cat=1>$2</a>
wobei $0 das ganze Muster ist, $1 die erste Klammer u.s.w. D.h. wenn Du einen Fund im preg wiederverwenden willst, musst Du ihn klammern, eg. ](.*)[/ den Linktext
 
Danke schonmal ich habe jetzt ein bisschen verstanden wie es geht.

Was ich allerdings nicht verstehe ist, warum die ersten Beiden Funktionen (und leider ja die wichtigsten) nicht funktionieren.
Wenn ich diesen Text verwende wandelt das Script in nur in einen normalen Link um.
$txt='[link "page.php"]Test[/link]';

Die Funktion funktioniert also, aber etwas stimmt mit den Reguläre Ausdrücken nicht. Aber was?
 
Zurück
Oben