Andü: Suchen in einem String

Hallo!

Gibt es eine Funktion, mit der man innerhalb eines (mehrzeiligen) Strings nach allen Vorkommen eines Suchmusters suchen kann. Habe das über die eregi-Funktion probiert hab aber immer nur eine Lösung bekommen.
Suchen will ich alle Strings die etwa so aussehen:
%test% oder %versuch% oder %nocheintest%
Bis jetzt hab ich das mit diesem Suchmuster gemacht:
%([a-z]+)%

Wie gesagt will ich alle Vorkommen dieses Suchmusters haben...

MfG Andü

  1. Hallo!

    Suchen will ich alle Strings die etwa so aussehen:
    %test% oder %versuch% oder %nocheintest%
    Bis jetzt hab ich das mit diesem Suchmuster gemacht:
    %([a-z]+)%

    Wie gesagt will ich alle Vorkommen dieses Suchmusters haben...

    Probiers mal mit preg_match_all.

    Gruß
    Andi

    1. Hallo!

      Suchen will ich alle Strings die etwa so aussehen:
      %test% oder %versuch% oder %nocheintest%
      Bis jetzt hab ich das mit diesem Suchmuster gemacht:
      %([a-z]+)%

      Wie gesagt will ich alle Vorkommen dieses Suchmusters haben...

      Probiers mal mit preg_match_all.

      Danke, die Funktion funzioniert.
      Das Problem daran ist bloß, dass der sich über die Backslaches aufregt:
      Warning:  Delimiter must not be alphanumeric or backslash in...

      Wenn ich als Suchmuster "(%)([a-z]+)(%)" das schreib kommt dafür:
      Warning:  Unknown modifier '(' in...

      Was mach ich falsch?

      1. Hallo!

        Suchen will ich alle Strings die etwa so aussehen:
        %test% oder %versuch% oder %nocheintest%
        Bis jetzt hab ich das mit diesem Suchmuster gemacht:
        %([a-z]+)%

        Wie gesagt will ich alle Vorkommen dieses Suchmusters haben...

        Probiers mal mit preg_match_all.

        Danke, die Funktion funzioniert.
        Das Problem daran ist bloß, dass der sich über die Backslaches aufregt:
        Warning:  Delimiter must not be alphanumeric or backslash in...

        Wenn ich als Suchmuster "(%)([a-z]+)(%)" das schreib kommt dafür:
        Warning:  Unknown modifier '(' in...

        Was mach ich falsch?

        Die Regex muss man da immer begrenzen also z.B. mit @ oder #. In deinem Fall also:
        "#(%)([a-z]+)(%)#"

        und dann sollte es klappen ;)

        1. Es geht, juhuuuu!

          Ich danke dir wie verrückt...

          1. Ach so, hätt ich fast vergessen.
            Gibt's da auch noch'n Zusatz der gleich die Doppelten aus dem Array löscht?

            1. Ach so, hätt ich fast vergessen.
              Gibt's da auch noch'n Zusatz der gleich die Doppelten aus dem Array löscht?

              Du bist schon wirklich ein leie? Nicht böse gemeint, aber lies doch mal ein bischen die Doku.

              array_unique ist glaube ich hier das Zauberwort

              1. Hallo Andi,

                Du bist schon wirklich ein leie?

                SCNR,

                Gruß
                Lachgas

                --
                Keine Verbesserung ist zu klein oder geringfügig, als dass man sie nicht durchführen sollte. (Adorno)
                1. Hallo Andi,

                  Du bist schon wirklich ein leie?

                  SCNR,

                  Wollte niemanden beleidigen. Aber wenn man ein bischen googelt (array doppelte Einträge php) dann kommt man sicher auf die Doku-Seiten.

                  Gruß
                  Andi

              2. Du bist schon wirklich ein leie? Nicht böse gemeint, aber lies doch mal ein bischen die Doku.

                array_unique ist glaube ich hier das Zauberwort

                Was heißt hier Leie? Wo soll denn bitte die Doku stehen? Ich musste mir erst selbst eine Suchen...
                Entweder bin ich wirklich zu doof oder die ist so gut versteckt, dass ich die net find.

                @N2 (alias Lachgas): Was heißt SCNR?

                1. hi,

                  Was heißt hier Leie? Wo soll denn bitte die Doku stehen? Ich musste mir erst selbst eine Suchen...
                  Entweder bin ich wirklich zu doof oder die ist so gut versteckt, dass ich die net find.

                  wo soll die doku schon zu finden sein - unter http://www.php.net/manual/de/ natürlich.
                  jemand, der noch nicht mal die doku kennt, sollte nicht anfangen, in PHP zu programmieren.

                  @N2 (alias Lachgas): Was heißt SCNR?

                  warst du jetzt auch schon wieder zu ..., danach zu suchen?

                  gruß,
                  wahsaga

                  --
                  "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                  1. wo soll die doku schon zu finden sein - unter http://www.php.net/manual/de/ natürlich.
                    jemand, der noch nicht mal die doku kennt, sollte nicht anfangen, in PHP zu programmieren.

                    Achso, das meinst du mit Doku. Dann kenn ich sie... da war ich ja auch für die Funktion. Dann hab ich das wahrscheinlich übersehen...

                    Ist halt nicht jeder so'n Checker wie ihr ;-).

  2. Hello,

    probier mal dies:

    $_pos = array();
      $lastpos = 0;
      $hilfsstring = strtolower($string);
      #$suchmuster dann auch strtolower()

    while($lastpos = strpos($hilfsstring,$suchmuster,$lastpos)!== false)
      {
        $_pos = $lastpos;
      }

    http://de3.php.net/manual/en/function.strpos.php

    Regular Expressions sind wahrscheinlich viel teurer als diese Variante.
    Solannge das Suchmuster so einfach ist, also nur einen statischen zusammenhängenden String darstellt, geht es so. Sonst würde die Funktion etwas komplizierter werden und sinnvollerweise mit einem Referenz-Parameter für den Haufen arbeiten, anstelle eines Offsets.

    Beispiel: gefunden werden soll der String zwischen dem ersten <td> und dem folgenden </td>

    function get_data_area(&$indata,   # zu durchsuchende Daten
                           $start,     # Startzeidchenkette
                           $stop,      # Stoppzeichenkette
                           $skip=true) # false --> $indata wird auch verkürzt, wenn kein Treffer war
    {
      if ($indata === false) return false;

    $i_indata = strtolower($indata);
      $start    = strtolower($start);
      $stop     = strtolower($stop);

    $startpos = strpos($i_indata,$start);
      if($startpos === false)
      {
        if (!$skip)
        {
          $indata = false;
        }
        return false;
      }

    $startlen = strlen($start);
      $stoplen  = strlen($stop);

    $stoppos  = strpos($i_indata, $stop, $startpos+$startlen);

    if ($stoppos > $startpos)
      {
        $outdata = substr($indata,$startpos + $startlen,$stoppos - $startpos - $startlen);
        $indata = substr($indata,$stoppos + $stoplen);
        return $outdata;
      }

    $indata = false;
      return false;
    }

    Die Start- und Stoppzeichnketten gehören nicht zum gesuchten Teilstring.
    Diese Funktion gibt nun nicht die Vorkommensposition zurück, sondern den eingeschlossenen String
    Du kannst die Funktion leicht um ein weiteres Attribut (Referenz) erweitern, um auch die Trefferposition zu erhalten.

    Ich habe mit der Funktion tausende von HTML-Seiten nach bestimmten Kriterien durchsuchen lassen. Sie ist wesentlich schneller, als eine vergleichbare Regular Expression.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

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