Hi,
$test="text&site=234&text2=www&site=567&site=54332&text";
$test = preg_replace("!&site=(.*?)&!","&",$test);
Weil das &site=567& findet und dann site=54332& nicht mehr macht - vermute ich.
Richtig vermutet.
Na, dann aber 3 Fragen hierzu:
Die Regex hat ja sowohl &site=234& gefunden und ersetzt, als auch &site=567&.
- Warum dann nur das letzte nicht?
Weil diese Fundstelle mit der vorherigen überlappt.
- Wo ist die Logik dahinter?
für einen weiteren Versuch wird NACH der vorherigen Fund-/Ersetzungsstelle begonnen.
Das & vor dem letzten Site ist Bestandteil der vorletzten Fund-/Ersetzungsstelle.
- Wie gestalte ich den Ausdruck entsprechend gieriger?
Indem Du das & am Anfang der Fundstelle nicht matchst, sondern per lookbehind einbindest.
Und auch gleich noch den Fall berücksichtigst, daß vor dem ersten Parameter kein & steht, sondern ein ?.
Und wenn Du schon dabei bist, auch gleich noch das ; als Parametertrennung berücksichtigen.
Ach ja, wenn der site-Parameter der letzte Parameter in der URL ist, wird er auch nicht ersetzt werden, da kein & mehr folgt.
Da der Parameterwert kein & oder ; enthalten darf, wäre es besser, statt (.*?)& besser [^&;]+ zu verwenden. Dann klappt's auch mit dem letzten Parameter.
Damit kommt es auch nicht mehr zu Überlappungen bei ?site=1&site=2, da das & dazwischen kein Bestandteil der Fund-/Ersetzungsstelle ist.
Die Ersetzung muß dann natürlich leer sein statt &
cu,
Andreas
Warum nennt sich Andreas hier MudGuard?
O o ostern ...
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.