Doppelte Variable in einer URL filtern
Tolwin
- php
Hallo Forum,
kann mir jemand sagen mit welcher PHP Funktion ich einen doppelten Variablenwert aus einer URL "rauswerfen" kann?
http://www.blabla.de?var1=111&var2=222&var1=333
Ich möchte jetzt alle var1 außer dem ersten var1 aus dem Link entfernen.
Hat jemand nen Tipp für mich?
Danke und Gruß
Tolwin
Hallo Forum,
kann mir jemand sagen mit welcher PHP Funktion ich einen doppelten Variablenwert aus einer URL "rauswerfen" kann?
http://www.blabla.de?var1=111&var2=222&var1=333
Die richtige Antwort lautet: Vermeide, das das entsteht?
Hier folgt nun die falsche Antwort.
Ich möchte jetzt alle var1 außer dem ersten var1 aus dem Link entfernen.
$var = "[a-zA-Z][a-zA-Z0-9_]+";
$val = "[a-zA-Z%0-9+]+";
$bind = "(?:[&;,]|&)";
$out = preg_replace( /($var=$val$bind)($var=$val$bind)?\1/, $1$2, $in );
Dieser Code stammt von einem Perlianier und wurde nicht getestet.
mfg Beat
Hallo Beat,
danke für deine Antwort.
Leider funktioniert es so nicht. Da ich der RegEx nicht mächtig bin -
könntest Du mir kurz erklären was Du genau machst ... vielleicht kann ich
es dann bei mir zum Laufen bringen.
Nochmals Danke!
Leider funktioniert es so nicht.
Das habe ich erwartet, dass es nicht auf Anhieb funktioniert.
Derlei Nachbearbeitungen brauchen Tests über reale und variierende Query-Strings.
Hier ist eine kleine Korrektur:
$out = preg_replace( /($var=$val$bind)($var=$val$bind)?\1/, $1 . $2, $in );
^^^
oder
$out = preg_replace( /($var=$val$bind)($var=$val$bind)?\1/, "$1$2", $in );
Da ich der RegEx nicht mächtig bin -
könntest Du mir kurz erklären was Du genau machst ... vielleicht kann ich
es dann bei mir zum Laufen bringen.
Gegenfrage:
Wo holst du diese URL mit Query String her?
Handelt es sich um eine Url, welche zusammengebastelt wurden um im HTML verwendet zu werden? In diesem Fall sind die & nicht HTML gerecht maskiert worden.
Auch bist du dann selbst verantwortlich, dass solches gar nicht erst entsteht.
Oder handelt es sich (was ich bezweifle), um den Query-String, der mit der Methode GET auf deinem Server ausgelesen werden kann?
Ich kenne Fälle, wo es erwünscht ist, dass auf dem Server nacheinander die verschiedene Werte zum gleichen Parameter ankommen.
mfg Beat
Wo holst du diese URL mit Query String her?
Ich frage die URL mit $_SERVER['REQUEST_URI']; ab
Die Variablen werden im Moment noch mit $_GET ausgelesen, da man
dem Programm aber "fremde" Variablen untermogeln kann, versuche ich
dies zu verhindern. Sicher kommter der Einwand, dass ich das im Programm
machen sollte - was richtig ist. Ich möchte aber gerne aus der URL
alle später vorkommenden var1 entfernen und nur die erste var1 verwenden.
Danke für die Korrektur .. ich gucks mir gleich an!
Grüße
Tolwin
Wo holst du diese URL mit Query String her?
Ich frage die URL mit $_SERVER['REQUEST_URI']; abDie Variablen werden im Moment noch mit $_GET ausgelesen, da man
dem Programm aber "fremde" Variablen untermogeln kann, versuche ich
dies zu verhindern. Sicher kommter der Einwand, dass ich das im Programm
machen sollte - was richtig ist. Ich möchte aber gerne aus der URL
alle später vorkommenden var1 entfernen und nur die erste var1 verwenden.
Das ist der falsche Ansatz.
Wenn du befürchtest, dass User auf deinem Skript Unfug betreiben wollen, dann musst du zuerst die URI durch PhP standardkonform in Komponenten zerlegen lassen. PhP stellt hier bequeme Zugriffe zur Verfügung.
Ich schreibe in Perl.
Ich habe eine Testroutine die alle einkommenden Parameter prüft auf deren Gültigkeit. Die zugehörigen Werte werden validiert. Wenn die Werte nicht valide sind, werden Defaultwerte gesetzt.
Das Prinzip dabei ist immer: Definiere was du willst. Versuche nie Dinge zu flicken, die du nicht willst.
foreach( keys %InHash ){
/^name$/ and
( $InHash{name} =~ /[1]{2,24}$/ or $InHash{name} = 'invalid');
/^age$/ and
( $InHash{age} =~ /^\d{1,3}$/ or $InHash{age} = 0);
}
Das ist jetzt simplifiziert. Tatsächlich verwalte ich Defaultwerte in einem hash, dessen Keys auch gleich bestimmen, was beim Auslesen überhaupt ein valider Inputkey sein darf.
Das klingt jetzt komplex und aufwändig, ist aber sauber, wenn die Anwendung wächst.
Damit ist Unfug unmöglich, und wenn jemand sich im Formular vertut, bekommt er dennoch einen sinnvollen Defaultwert verarbeitet, und keine lästigen Nachrichten.
Im weiteren muss ich leider passen und hoffe, dass dir ein PHP-Autor weiter hilft.
mfg Beat
A-Za-z_- ↩︎
Vielen Dank für die Unterstützung Beat.
Ich werde mal versuchen Deinen Ansatz umzusetzen.
Grüße
Tolwin
$out = preg_replace( /($var=$val$bind)($var=$val$bind)?\1/, $1 . $2, $in );
$in steht für die URL, richtig?!
$in steht für die URL, richtig?!
jup
mfg Beat