Nicole: strrchr suche nach string NICHT EINZELNES ZEICHEN

Hallo erst mal ;-)

Gibt es eine einfache Möglichkeit um nach dem
letzten Vorkommen eines Strings(NICHT ZEICHEN) zu suchen?

String:
$str="New Mess 12344 Test New Mess Test2 New Mess Nordpol";

Gewünschter String:
$str2="New Mess Nordpol";

Beispiel 1
strrchr($str,"NEW MESS");
// AUSGABE: Nordpol

Beispiel 2
strstr($str,"NEW MESS");
// AUSGABE: New Mess 1234

DAS PROBLEM:
Die Funktion strrchr() such immer nur nach einem
Zeichen nicht nach einer Wortkette.
Sicher ich könnte den String weiter zerlegen
und so den gewünschten String rausfiltern,

Aber gibts keine einfache Möglichkeit, so
wie strstr(), nur eben nicht erstes Vorkommen, sondern
letztes Vorkommen vom Suchstring.

Gruss Nikki

  1. Hi,

    ich habe gerade mal selfphp.info gschaut aber nichts passendes gefunden.
    Schau am besten selbst einmal:
    http://www.selfphp.info/funktionsuebersicht/string_funktionen.php

    strpos findet das erste Vorkommen einer Zeichenkette.
    strrpos findet laut selfphp nur das letzte Zeichen.

    Aber versuchs einfach auch mal mit ner Zeichenkette.

    Gruß
    Christian

  2. Moin!

    Hallo erst mal ;-)

    Gibt es eine einfache Möglichkeit um nach dem
    letzten Vorkommen eines Strings(NICHT ZEICHEN) zu suchen?

    Nein, scheinbar nicht. PHPs eingebaute Stringfunktionen erlauben es nur, ganze Strings von vorne aus suchen zu lassen, und von hinten nur einzelne Zeichen.

    Du mußt dir also eine eigene Funktion zusammenstricken.

    Lösungsansätze:

    Mit strrev() kannst du Strings umdrehen. Wenn du needle und haystack umdrehst und dann von vorne suchst (strstr() oder strpos(), wie gewünscht), und dann die Position ebenfalls wieder umrechnest auf den Vorwärts-String, solltest du die gewünschte Information kriegen können.

    Wahlweise kannst du natürlich auch solange von vorne in Teilstrings suchen, bis du keine Ergebnisse mehr findest. Das ist dann offenbar das letzte Ergebnis. Hier bietet es sich durchaus an, eine rekursive Funktion zu benutzen, aber man kann es auch iterativ lösen.

    Wenn's auf Performance ankommt, mußt du mal testen, welche Variante schneller ist. Ich vermute, der erste Vorschlag ist schon sehr gut.

    - Sven Rautenberg

    --
    "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    1. Hallo Sven,

      Lösungsansätze:

      Mit strrev() kannst du Strings umdrehen. Wenn du needle und haystack umdrehst und dann von vorne suchst (strstr() oder strpos(), wie gewünscht), und dann die Position ebenfalls wieder umrechnest auf den Vorwärts-String, solltest du die gewünschte Information kriegen können.

      Na so gehts auch nicht ganz, beim Umdrehen des
      strings findet needle natürlich dahinter nichts
      mehr zum Anzeigen.

      Aber wollte auch nur wissen ob es nicht eine
      vordefinierte Funktion wie strstr() gibt.
      Ist sonst immer ärgerlich wenn man was selber
      zusammenstrickt und dann irgenwann sieht:"Hätte
      so einfach sein können";-) Hatte ich als ich
      array_merge nomals selbst erfunden hatte;-)

      Na ja, da es das nicht gibt,
      löse ich dies mit explode und lasse mir mit end()
      das letzte element anzeigen, natürlich indem ich den
      Trennbegriff wieder zufüge.

      Danke
      Nikki

  3. Hallo,

    Gibt es eine einfache Möglichkeit um nach dem
    letzten Vorkommen eines Strings(NICHT ZEICHEN) zu suchen?

    Die Funktion strrpos() gibt die Position des Suchstrings (ab 0) von rechts aus.

    MfG, Thomas

    1. Moin!

      Gibt es eine einfache Möglichkeit um nach dem
      letzten Vorkommen eines Strings(NICHT ZEICHEN) zu suchen?

      Die Funktion strrpos() gibt die Position des Suchstrings (ab 0) von rechts aus.

      Aber leider: "Note that the needle in this case can only be a single character. If a string is passed as the needle, then only the first character of that string will be used."

      - Sven Rautenberg

      --
      "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)