MudGuard: Regulärer Ausdruck macht nicht ganz, was er soll

Beitrag lesen

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&.

  1. Warum dann nur das letzte nicht?

Weil diese Fundstelle mit der vorherigen überlappt.

  1. 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.

  1. 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.