Peter: Regexp zum Suchen/Ersetzen einer Zahl in einem String

Hallo,

ich habe folgendes Problem:

Ich habe in PHP einen Query-String, bei dem ich bestimmte Werte ersetzten muss.
Der String sieht in etwa so aus:
Name1=Wert1&path=/pfad/art/25563&Name2=Wert2&Name3=Wert3

Diese Zahl bei path=/pfad/art/xxxx muss ich durch eine andere ersetzen. Diese Zahl kann zwischen einer und fünf Ziffern lang sein. Das Problem ist aber, dass beliebig viele andere Wertepaare (dessen Werte durchaus auch Zahlen sein können) vor und hinter dieser path=... Angabe stehen können. Es kann auch kein weiteres Wertepaar vor oder hinter path=... stehen.

Ich denke, das hier ein regulärer Ausdruck genau das richtige ist, um diese Zahl zu finden und durch eine andere zu ersetzen.
Dazu bietet PHP ja die Funktion "preg_replace()". Also man müsste erstmal, um sicherzustellen, dass man die richtige Zahl ersetzt (sofern es mehrere Zahlen im Query-String gibt), nach "/pfad/art/" suchen und anschliessend von dort aus die erste vorkommende Zahl ersetzen.

Hört sich leicht an, ist aber für mich, der sich mit RegExp nicht auskennt, ein unmögliches Unterfangen.
Wer kann mit helfen und einen RegExp nennen, der dese Aufgabe erfüllt?

Vielen Dank und viele Grüße...

Peter

  1. Hallo Peter!

    Name1=Wert1&path=/pfad/art/25563&Name2=Wert2&Name3=Wert3

    Diese Zahl bei path=/pfad/art/xxxx muss ich durch eine andere ersetzen. Diese Zahl kann zwischen einer und fünf Ziffern lang sein.

    Ich habe auch kaum Ahnung von RegExp, aber folgender sollte passen (ich habs mit dem Programm visual REGEXP ausprobiert, aber in PHP sollte er dann auch funktionieren bzw. evtl. ein wenig angepaßt):
    path=/[a-z]*/[a-z]*/([0-9]{1,5})
    Er matcht erst den path, und als 2. Ergebnis sollte dann die Zahl gematcht werden.
    (ob und wie das mit preg_match geht weiß ich auch nicht, da mußt Du eben kurz im Manual nachlesen)

    MfG
    Götz

    --
    Losung für Samstag, 19. Juni 2004
    Ich will euch von all eurer Unreinheit erlösen. (Hesekiel 36,29)
    Was aus dem Mund herauskommt, das kommt aus dem Herzen, und das macht den Menschen unrein. (Matthäus 15,18)
    (http://www.losungen.de/heute.php3)
    1. Hi Götz,

      Ich habe auch kaum Ahnung von RegExp, aber folgender sollte passen (ich habs mit dem Programm visual REGEXP ausprobiert, aber in PHP sollte er dann auch funktionieren bzw. evtl. ein wenig angepaßt):
      path=/[a-z]*/[a-z]*/([0-9]{1,5})

      Danke für diesen RegExp. Er passte noch nicht ganz, aber ich konnte ihn dank deiner Vorlage schnell anpassen:

      preg_replace("/(&path=/[a-z]*/[a-z]*/)([0-9]{1,5})/", "${1}".$newnr, $_SERVER['QUERY_STRING'])

      ersetzt genau diese eine Zahl im String.
      Danke vielmals.

      Peter

      1. Hallo Peter!

        path=/[a-z]*/[a-z]*/([0-9]{1,5})

        preg_replace("/(&path=/[a-z]*/[a-z]*/)([0-9]{1,5})/", "${1}".$newnr, $_SERVER['QUERY_STRING'])

        Ich hatte auch zuerst noch Delimiter drum und die / dann natürlich escaped, aber Visual REGEXP hat das nicht gefressen, dann hab ichs eben ohne gemacht, so hattest Du auch noch ein wenig was zu tun ;)

        MfG
        Götz

        --
        Losung für Samstag, 19. Juni 2004
        Ich will euch von all eurer Unreinheit erlösen. (Hesekiel 36,29)
        Was aus dem Mund herauskommt, das kommt aus dem Herzen, und das macht den Menschen unrein. (Matthäus 15,18)
        (http://www.losungen.de/heute.php3)
  2. Holladiewaldfee,

    Ich habe in PHP einen Query-String, bei dem ich bestimmte Werte ersetzten muss.

    Mußt Du direkt mit dem Query-String arbeiten oder kannst Du nicht auch auf die einzelnen Teile (z.B. aus $_GET) zugreifen und ihn anschließend neu zusammensetzen?

    Der String sieht in etwa so aus:
    Name1=Wert1&path=/pfad/art/25563&Name2=Wert2&Name3=Wert3

    Ich würde erstmal den String zerlegen:

    $aQuery = explode('&', $sQuery);

    Dann das ganze Array in einer Schleife durchgehen, und den passenden Teil rauspicken (substr). Anschließend kannst Du dann relativ gefahrlos den RegExp draufklatschen. Oder einfach den letzten Teil nochmal mit explode('/', $aQuery[$xyz]) zerlegen und den letzten Eintrag des resultierenden Arrays ersetzen.

    Anschließend mußt Du den String halt wieder mit implode() zusammenbasteln, aber das ist ja net sooo die Sache.

    Ciao,

    Harry

    --
      Bald kommt die Waldfee ... (Projektphase: Planung)
      Bis dahin:
      http://harry.ilo.de/projekte/berge/
    1. Hi Harry,

      Mußt Du direkt mit dem Query-String arbeiten oder kannst Du nicht auch auf die einzelnen Teile (z.B. aus $_GET) zugreifen und ihn anschließend neu zusammensetzen?

      Das könnte man sicherlich auch machen, aber da ich auf jeden Fall wieder den kompletten Query-String brauche (nur eben mit diesem einen geänderten Wert) wollte ich lieber direkt den Query-String bearbeiten, als diesen erst zu zerlegen, die Zahl zu ersetzen und den dann wieder zusammenzubauen. Ich dachte, mit einem RegExp wäre es "effektiver".

      Viele Grüße

      Peter

      1. Hello,

        Das könnte man sicherlich auch machen, aber da ich auf jeden Fall wieder den kompletten Query-String brauche (nur eben mit diesem einen geänderten Wert) wollte ich lieber direkt den Query-String bearbeiten, als diesen erst zu zerlegen, die Zahl zu ersetzen und den dann wieder zusammenzubauen. Ich dachte, mit einem RegExp wäre es "effektiver".

        Das käme wieder mal auf einen diser berühmten Performance-Tests an. Reguläre Ausdrücke sind sehr teuer und zerlegen den String schließlich auch. Wahrscheinlich ist die Kombination aus den Funktionen

        parse_str()
          explode()
          implode()  2x

        da doch im Vorteil

        Schließlich ist Dir die Struktur Deiner Daten eindeutig bekannt.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Holladiewaldfee,

          Das käme wieder mal auf einen diser berühmten Performance-Tests an. Reguläre Ausdrücke sind sehr teuer und zerlegen den String schließlich auch. Wahrscheinlich ist die Kombination aus den Funktionen

          Allerdings werden reguläre Ausdrücke von PHP in irgendeiner kompilierten Form gecached und sind somit nur bei der ersten Anwendung langsam. Ich muß aber zugeben, daß ich nicht weiß, ob der Cache nur für einen Request angelegt wird oder ob die Dinger requestübergreifend gecached werden. Wenn letzteres der Fall wäre könnte die Lösung mit dem RegExp am Ende doch die schnellere sein.

          Aber wenn er nicht grade perfomance-kritische Anwendungen schreibt (wovon ich ausgehe, sonst könnte er mit RegExps umgehen), dürften ihn die paar Millisekunden hin oder her kaum kratzen ...

          Ciao,

          Harry

          --
            Bald kommt die Waldfee ... (Projektphase: Planung)
            Bis dahin:
            http://harry.ilo.de/projekte/berge/
    2. Hello Harry,

      Ich würde erstmal den String zerlegen:

      $aQuery = explode('&', $sQuery);

      Du hast übersehen, dass der erst Paramete durch ein '?' eingeleitet wird und nicht durch ein '&'

      Nimm doch lieber parse_str()

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Holladiewaldfee,

        Du hast übersehen, dass der erst Paramete durch ein '?' eingeleitet wird und nicht durch ein '&'

        In seiner Beschreibung stand allerdings kein "?" am Anfang des Strings.
        parse_str() kannte ich noch nicht. Scheint mir eine von den Funktionen zu sein, die man genau einmal in hundert Jahren braucht ;-)

        Ciao,

        Harry

        --
          Bald kommt die Waldfee ... (Projektphase: Planung)
          Bis dahin:
          http://harry.ilo.de/projekte/berge/
  3. Hello,

    Name1=Wert1&path=/pfad/art/25563&Name2=Wert2&Name3=Wert3

    vielleicht helfen Dir http://www.php.net/manual/de/function.parse-str.php und http://www.php.net/manual/de/function.explode.php weiter.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau