Mark: Inhalt zwischen 2 Bereichen ausgeben...

... ein Hallo erstmal :)

Viele Wege führen nach Rom, ich bin diesmal bestimmt 10 Mal dran vorbeigelaufen, Beispiel:

$zeichenkette="xxxx ac Test ca xxxx";
$start="ac";
$end="ca";
echo trim(str_replace($start, "", str_replace(strstr ( $zeichenkette, $end), "", strstr ( $zeichenkette, $start))));

Gibt es da vielleicht auch eine schnellere, elegantere Möglichkeit an den Inhalt zwischen "ac" und "ca" zu kommen? Möchte letztendlich den Inhalt zwischen zwei (unterschiedlichen) Kommentaren einer html-datei auslesen.

Gruß, Mark

  1. Hello,

    Gibt es da vielleicht auch eine schnellere, elegantere Möglichkeit an den Inhalt zwischen "ac" und "ca" zu kommen? Möchte letztendlich den Inhalt zwischen zwei (unterschiedlichen) Kommentaren einer html-datei auslesen.

    Das Interessante dürfte ja noch sein, wie oft die Start- und Stopzeichenketten in der Gesamtkette vorhanden sind und in welcher Reihenfolge, ob paarig oder unpaarig ...

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  2. Hi Mark,

    Gibt es da vielleicht auch eine schnellere, elegantere Möglichkeit an den Inhalt zwischen "ac" und "ca" zu kommen? Möchte letztendlich den Inhalt zwischen zwei (unterschiedlichen) Kommentaren einer html-datei auslesen.

    Probiers doch mal mit preg_match():

    $match = preg_match("/ac(.*)ca/", $suchstring, $treffer);

    In match hast du dann true oder false stehen, daran siehst du, ob etwas gefunden wurde oder nicht. in $treffer findest du das Ergebnis des eingeklammerten Suchstrings, so wie der ganze gematchte String ($treffer ist ein Array);

    Wenn du mehrere Ergebnisse haben willst (preg_match() gibt dir nur das erste), dann verwende preg_match_all().

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
    Probleme mit Formularen?
    http://tutorial.riehle-web.com hilft weiter.
    1. Hello,

      $match = preg_match("/ac(.*)ca/", $suchstring, $treffer);

      Zu bemerken ist, dass $treffer ein Array ist und das (.*) gierig ist, was bedeutet, dass

      <?php   ### preg.php ###

      $string = 'Hier geht das ac los, mach doch mal ca. soviel Pica kommt';

      $match = preg_match("/ac(.*)ca/", $string, $treffer);

      echo "string: $string <br>";
        echo "match: $match <br>";
        echo "treffer: $treffer <br>";

      echo nl2br(htmlentities(print_r($treffer,true)));
      ?>

      das als Ergebnis

      string: Hier geht das ac los, mach doch mal ca. soviel Pica kommt
      match: 1
      treffer: Array
      Array
      (
      [0] => ac los, mach doch mal ca. soviel Pica
      [1] => los, mach doch mal ca. soviel Pi
      )

      ergibt, also nur die äußere Klammerung mit den Suchbegriffen berücksichtigt wird. Die inneren Grenzen werden von (.*) 'aufgefressen'

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

      Tom

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

        $match = preg_match("/ac(.*)ca/", $suchstring, $treffer);

        Zu bemerken ist, dass $treffer ein Array ist und das (.*) gierig ist, was bedeutet, dass

        Uups, und ich wollte irgendwie noch einen Modifier dahinter schreiben, na ja, es muss also so heißen:

        $match = preg_match("/ac(.*)ca/U", $suchstring, $treffer);
                                      ^^^ => U für Ungreedy

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
        Newbies aufgepasst: Auf viele Fragen findet man eine
        Antwort im Archiv, das man auch durchsuchen kann
        1. Hello,

          $match = preg_match("/ac(.*)ca/", $suchstring, $treffer);

          Zu bemerken ist, dass $treffer ein Array ist und das (.*) gierig ist, was bedeutet, dass

          Uups, und ich wollte irgendwie noch einen Modifier dahinter schreiben, na ja, es muss also so heißen:

          $match = preg_match("/ac(.*)ca/U", $suchstring, $treffer);
                                        ^^^ => U für Ungreedy

          Das funktioniert aber immer noch nicht so, wie ich es erwarten würde.

          Da sollte dann nur ' doch mal ' übrig bleiben, weil es direkt von 'ac' und 'ca' eingeschlossen ist.
          Muss man die Grenzen im Muster dann extra ausschließen? Das lerne ich wohl nie mehr...

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

          Tom

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

            $match = preg_match("/ac(.*)ca/U", $suchstring, $treffer);

            Das funktioniert aber immer noch nicht so, wie ich es erwarten würde.

            Da sollte dann nur ' doch mal ' übrig bleiben, weil es direkt von 'ac' und 'ca' eingeschlossen ist.
            Muss man die Grenzen im Muster dann extra ausschließen? Das lerne ich wohl nie mehr...

            Also wir hatten ja diesen String:

            $string = 'Hier geht das ac los, mach doch mal ca. soviel Pica kommt';

            Da sollte in $treffer drin stehen:

            [0] "ac los, mach doch mal ca"
            [1] " los, mach doch mal "

            Was meinst du jetzt mit Grenzen? Meinst du die Leerzeichen? Um die auszuschließen, müsste man den RegEx so schreiben:

            $match = preg_match("/ac (.*) ca/U", $suchstring, $treffer);

            Dann sollte man haben:

            [1] "los, mach doch mal"

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
            Interessiert in Modellbahn?
            Wie wärs mit http://www.go-modellbahn.de?
            1. Hello,

              $match = preg_match("/ac(.*)ca/U", $suchstring, $treffer);

              Das funktioniert aber immer noch nicht so, wie ich es erwarten würde.

              Sorry, Guckfehler.
              Da sollte dann nur 'h doch mal ' übrig bleiben, weil es direkt von 'ac' und 'ca' eingeschlossen ist.

              Was meinst du jetzt mit Grenzen? Meinst du die Leerzeichen? Um die auszuschließen, müsste man den RegEx so schreiben:

              Im String sind doch beide Grenzen zweimal enthalten. Schau mal genau hin.

              $string = 'Hier geht das ac los, mach doch mal ca. soviel Pica kommt';
                                       ^^       ^^           ^^           ^^

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

              Tom

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

                Was meinst du jetzt mit Grenzen? Meinst du die Leerzeichen? Um die auszuschließen, müsste man den RegEx so schreiben:

                Im String sind doch beide Grenzen zweimal enthalten. Schau mal genau hin.

                $string = 'Hier geht das ac los, mach doch mal ca. soviel Pica kommt';
                                         ^^       ^^           ^^           ^^

                Es ist trotzdem so, wie ich sagte. Habe es einerseits gerade ausprobiert, andererseits aber auch noch mal im PHP Manual nachgelesen, dort steht:

                <zitat>preg_match() gibt die Anzahl der Übereinstimmungen mit Suchmuster zurück. Das ist entweder 0 (keine Übereinstimmung) oder 1, weil preg_match() die Suche nach der ersten Übereinstimmung beendet.</zitat>

                In Treffer steht also:

                Array
                (
                    [0] => ac los, mach doch mal ca
                    [1] =>  los, mach doch mal
                )

                Nicht mehr so sicher bin ich mir da, wenn man preg_match_all() verwendet, drum habe ich es auch hier mal kurz ausprobiert, Ausgabe:

                Array
                (
                    [0] => Array
                        (
                            [0] => ac los, mach doch mal ca
                        )
                    [1] => Array
                        (
                            [0] =>  los, mach doch mal
                        )
                )

                Es gibt also auch hier nur einen Suchtreffer (sonst müsste ja $treffer[1][1] noch vorhanden sein).

                Habe auch hierzu kurz im PHP Manual nachgeschlagen:

                <zitat>Nachdem die erste Übereinstimmung gefunden wurde, wird die nachfolgende Suche jeweils am Ende der letzten Übereinstimmung fortgesetzt.</zitat>

                D.h., die Suche wird also dort fortgesetzt, wo der vorherige Match aufhört. Da der erste Match ja " los, mach doch mal " war (s.o.), ist im nachfolgenden Reststring kein "ac" mehr vorhanden, und es wird nichts mehr gefunden.

                Zur Kontrolle mal noch dieser Test:

                $suchstring = 'Hier geht das ac los, mach doch mal ca. soviel ac's wie da auch ca's sind ;-)';

                Array
                (
                    [0] => Array
                        (
                            [0] => ac los, mach doch mal ca
                            [1] => ac's wie da auch ca
                        )
                    [1] => Array
                        (
                            [0] =>  los, mach doch mal
                            [1] => 's wie da auch
                        )
                )

                Also, ich glaube, jetzt ist es klar ;-)

                So bis ins Detail, hab ich mich damit aber bis jetzt auch noch nie beschäftigt.

                MfG, Dennis.

                --
                Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
                Sinnvolles Zitieren: Man zitiert nur Teilsätze des Vorposters
                auf die man sich bezieht! Nicht einfach alles.
                1. Hello,

                  sollten wir da beide keinen Fehler gemacht haben, steckt darin durchaus eine Gefahr für diverse Filter. Die Sache mit preg_match_all habe ich auch gleich nochmal vorgekramt...

                  Ich hatte da vor längerer Zeit mal ein Mime-Mail-Modul geschrieben, dem man wahlweise einfach einen Link auf eine HTML-Ressource oder die Ressource selber als String (Stream) übergeben konnte, und das dann zumindest die typischen included Files (<img>, <style>, <link rel>, ...) aufgelöst und als CID und eingebettetes File versenden kann...

                  Da habe ich eben natürlich sofort rot gesehen!

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

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
    2. Danke Dennis, sollte nur einmal vorkommen. So wie es bisher aussieht komme ich damit weiter ;)

      Gruß Mark