Jojo55²: str_replace

Hallo liebe Leser

Ich habe folgendes Problem
Auf einer Seite steht folgender Code:

// Variablendeklaration und -initialisierung für URL
$URL = $_SERVER['QUERY_STRING'];
// Funktionen

$LINK = str_replace("order1=%&order2=", "order1=speed ASC&order2", $URL);

Die URL sieht ungefair so aus (man kanns nit genau sagen, da die später ja generiert wird ;) ) :

items.php?type=Schwere Kriegskunst&subtype1=Große Schlagwaffen&subtype2=Große Schlagwaffen&order1=itemname ASC&order2=levelreq1 DESC

Ich möchte, dass diese Funktion (oder wie man es nennen will) einfach ab "order1=" ALLES ersetzen, was bis "order2=" in $URL steht, es soll auch egal sein, was dazwischen stehen soll...

Ich weiß nur nicht, wie ich PHP das klar machen soll, dass es eben egal sein soll, was zwischen "order1=" und "&order2=" stehen soll.

Ich hoffe mal, dass das überhaupt geht ;)

  1. Hallo Jojo55²!

    $LINK = str_replace("order1=%&order2=", "order1=speed ASC&order2", $URL);

    Das sieht verdächtig danach aus, daß aus dem Query-String direkt SQL-Abfragen generiert werden.
    Falls dem wirklich so ist, solltest Du dringend dclp FAQ: 16.18. Wie kann ich bösartigen Code in SQL-Abfragen unterbinden? durchlesen.

    Ich weiß nur nicht, wie ich PHP das klar machen soll, dass es eben egal sein soll, was zwischen "order1=" und "&order2=" stehen soll.

    Mit Hilfe von Regulären Ausdrücken (siehe PHP Manual: XCIX. Regular Expression Functions (Perl-Compatible)) und der PHP-Funktion preg_replace() (siehe PHP Manual: preg_replace()) solltest Du es relativ einfach hinbekommen können.

    MfG
    Götz

    --
    Losung für Mittwoch, 1. Dezember 2004
    Ich will die Finsternis vor ihnen her zum Licht machen und das Höckerige zur Ebene. (Jesaja 42,16)
    Durch die herzliche Barmherzigkeit unseres Gottes wird uns besuchen das aufgehende Licht aus der Höhe, damit es erscheine denen, die sitzen in Finsternis und im Schatten des Todes, und richte unsere Füße auf den Weg des Friedens. (Lukas 1,78.79)
    (Losungslink)
  2. Huhu Jojo

    Ich weiß nur nicht, wie ich PHP das klar machen soll, dass es eben egal sein soll, was zwischen "order1=" und "&order2=" stehen soll.
    Ich hoffe mal, dass das überhaupt geht ;)

    Ja das geht, aber nicht mit str_replace().
    Schau Dir mal preg_replace() an.
    Evtl. ist für Deine Zwecke auch parse_str() nützlich.

    Beschreib doch mal was Du eigentlich machen möchtest, ich vermute es soll der
    aktuell gewählte Warenkorb, Menuepunkt oder Sortierkriterium per GET-Parameter weitergereicht werden.
    Da bietet sich vielleicht ein anderer Lösungsansatz an.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
  3. Hallo Jojo55²,

    $LINK = str_replace("order1=%&order2=", "order1=speed ASC&order2", $URL);

    Mir fallen zwei Moeglichenkeiten ein, naemlich preg_replace() und das Exploden des Strings. Ich wuerde, glaube ich, letzteres machen.
    $query_string = ?type=Schwere Kriegskunst&subtype1=Große Schlagwaffen.... //was fuer'n Zeug hast Du da nur drin...
    Zu bemerken ist, dass dein $query_string offenbar nicht urlencoded ist, solltest du nachholen. Also von vorn:
    $query_string = type=Schwere%20Kriegskunst&subtype1=Große%20Schlagwaffen....
    $query_array  = explode('&', $query_string);
    das sieht jetzt so aus:
      $query_array[0] = type=Schwere%20Kriegskunst;
      $query_array[1] = subtype1=Große%20Schlagwaffen;
    naechste Dimension geht so
    $i = 0;
    foreach($query_array as $value)
    {
      $tmp = explode('=', $query_array[0]);
      unset($query_array[$i]);
      $query_array[$i]['name'] = $tmp[0];
      $query_array[$i]['wert'] = $tmp[1]
       $i++
    }
    jetzt hast Du

    $query_array[0]['name'] = 'type';
      $query_array[0]['wert'] = 'Schwere%20Kriegskunst';

    usw.
    In dem Array kannst Du jetzt neu zuordnen wie du lustig bist, das Ergbnis wieder imploden und fertig.

    Die Loesung mit preg_replace erscheint auf den ersten Blick einfacher, ich finde sie aber unflexibler. Aber zu dem Thema wird sich sicher noch jemand aeussern.

    Gruß,

    Dieter