Björn: Suchmuster (URL) aus Text extrahieren

Hallo liebe Forumgemeinde,

ich habe seit längerem ein Problem was ich trotz der relativ klaren Aufgabenstellung einfach nicht gelöst bekomme. Selbstverständlich habe ich diese und viele andere Foren bereits nach Lösungen durchkämmt, komme aber eben nicht wirklich weiter.

Mein Problem ist folgendes:

Ich habe einen Ausgangstext in dem unter anderem einige URLs enthalten sind. Von diesen müssen aber nur einige URLs mit einem bestimmten Format (siehe unten) ausgelesen werden. Nun habe ich bereits sämtliche Suchmuster die ich finden konnte mit preg_match(); durchprobiert, aber es will einfach nicht klappen. Ich wäre ewig dankbar wenn mal jemand mit Ahnung ein Suchmuster für mich stricken könnte damit ich folgende URLs aus dem Text auslesen kann:

http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL

Wie kann das gelöst werden? Vielen Dank für euere Mithilfe!

Björn

  1. Hello Björn,

    [...] ein Suchmuster für mich stricken könnte damit ich folgende URLs aus dem Text auslesen kann:

    http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL

    Wie kann das gelöst werden? Vielen Dank für euere Mithilfe!

    Wieso Mithilfe?
    Du hast bisher nicht gepostet, was Du schon versucht hast.

    Aber ich habe trotzdem ein wenig geübt.

    #$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?([a-z0-9-]{2,})domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\b=i';

    $ergebnis = preg_match_all($pattern, $string, $_matches, PREG_PATTERN_ORDER || PREG_OFFSET_CAPTURE);

    echo "string:  ".htmlspecialchars(print_r($string,1))."<br>";
    echo "pattern: ".htmlspecialchars(print_r($pattern,1))."<br>";
    echo "Ergebnis:".htmlspecialchars(print_r($ergebnis,1))."<br>";
    echo "Treffer: ".htmlspecialchars(print_r($_matches,1))."<br>";

    Nur mit dem Teil, dass VARIABEL überall gleich sein muss, komme ich noch nicht klar.
    Wie man da eine Bckreferenz nutzen kann, die sich auf das erste Vorkommen von VARIABEL bezieht, habe ich noch nicht rausgefunden.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hello,

      das richtige Pattern hatte ich eben natürlich gelöscht :-(

      #$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?([a-z0-9-]{2,})domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\b=i';

      $pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=$1&code=([a-z0-9-]{2,})\b=i';

      $ergebnis = preg_match_all($pattern, $string, $_matches, PREG_PATTERN_ORDER || PREG_OFFSET_CAPTURE);

      echo "string:  ".htmlspecialchars(print_r($string,1))."<br>";
      echo "pattern: ".htmlspecialchars(print_r($pattern,1))."<br>";
      echo "Ergebnis:".htmlspecialchars(print_r($ergebnis,1))."<br>";
      echo "Treffer: ".htmlspecialchars(print_r($_matches,1))."<br>";

      Nur mit dem Teil, dass VARIABEL überall gleich sein muss, komme ich noch nicht klar.
      Wie man da eine Bckreferenz nutzen kann, die sich auf das erste Vorkommen von VARIABEL bezieht, habe ich noch nicht rausgefunden.

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Hello,

        das richtige Pattern hatte ich eben natürlich gelöscht :-(

        Und nochmal das falsche.
        Aber Du siehst, ich habe wenigstsns 'was ausprobiert!

        #$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?([a-z0-9-]{2,})domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\b=i';

        #> $pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=$1&code=([a-z0-9-]{2,})\b=i';

        $pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\b=i';

        $ergebnis = preg_match_all($pattern, $string, $_matches, PREG_PATTERN_ORDER || PREG_OFFSET_CAPTURE);

        echo "string:  ".htmlspecialchars(print_r($string,1))."<br>";
        echo "pattern: ".htmlspecialchars(print_r($pattern,1))."<br>";
        echo "Ergebnis:".htmlspecialchars(print_r($ergebnis,1))."<br>";
        echo "Treffer: ".htmlspecialchars(print_r($_matches,1))."<br>";

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Hello,

          der nächste Schritt ist auch geschafft!

          (Ich bitte um Berichtigungen)

          Code
          ----

            
          $pattern = '=\bhttp://www\.([a-z0-9\-]{2,})\.tld/aktiv\.php\?domain\=\1&code\=\1\b=i';  
            
          $ergebnis = preg_match_all($pattern, $string, $_matches, PREG_PATTERN_ORDER || PREG_OFFSET_CAPTURE);  
            
          echo "string:  ".htmlspecialchars(print_r($string,1))."<br>";  
          echo "pattern: ".htmlspecialchars(print_r($pattern,1))."<br>";  
          echo "Ergebnis:".htmlspecialchars(print_r($ergebnis,1))."<br>";  
          echo "Treffer: ".htmlspecialchars(print_r($_matches,1))."<br>";  
          
          

          Ausgabe
          -------
          string:  In diesem Text steht eine URL: http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL
                     in der kein Umruch sein darf und hier ist der zweite Hinweis
                     http://http://www.VARIABEL1.tld/aktiv.php?domain=VARIABEL&code=VARIABEL, der
                     aber nicht gefunden werden darf. Erst der dritte ist wieder im Muster,
                     dass wir vorgegebenn haben:http://www.VARI.tld/aktiv.php?domain=VARI&code=VARI; Ende der Durchsage
          pattern: =\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b=i
          Ergebnis:2
          Treffer: Array
          (
              [0] => Array
                  (
                      [0] => http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL
                      [1] => http://www.VARI.tld/aktiv.php?domain=VARI&code=VARI
                  )

          [1] => Array
                  (
                      [0] => VARIABEL
                      [1] => VARI
                  )

          )

          Das Pattern:
          ------------

          =\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b=i

          =                      Patterngrenze Anfang
          \b                     beginnt mit einer Wortgrenze
          http://www             Zeichen müsse vorkommen
          .                     Punkt muss drin sein, escaped, da Steuerzeichen in Patterns
          ([a-z0-9-]{2,})       Backreferenz, weil dreimal gleich im Muster vorkommen muss
             [a-z0-9-]          Alle Zeichen von a-z, von 0-9, und der Bindestrich
                                 weil dies _bisher_ die einzigen  waren, die in Domainnamen
                                 vorkommen durften (Großbuschtaben siehe Modifier)
                                 fehlen jetzt aber noch die Umlaute und sonstigen neuerdings
                                 auch erlaubten Zeichen, wie Pannen-Kot (PUNI-Code) usw.
             {2,}                was in der Klammer davor steht, mindestens 2 Mal
          .                     Punkt als Zeichen im Muster
          tld/aktiv              Text, der drinstehen soll
          .                     Punkt als Zeichen im Muster
          php                    Text, der drinstehen soll
          ?                     Fragezeichen als Zeichen im Muster, muss escaped werden, weil ...
          domain                 Text, der drinstehen soll
          =                     Gleichheitszeichen als Zeichen im Muster, muss escaped werden,
                                   weil es auch als Beginn- und Endezeichen für das Pattern benutzt
                                   wurde
          \1                     Backreferenz, d.h., dass es gelich dem ersten Ausdruck in
                                   runden Klammern sein muss
          &code                  Text, der drinstehen soll
          =                     Gleichheitszeichen als Zeichen im Muster, muss escaped werden ...
          \1                     Backreferenz, wie vorige
          \b                     Wortgrenze
          =                      Ende des Patterns
          i                      Modifier für das Pattern, es soll case insensitive gesucht werden

          Das ganze Ding müsste nun noch Pannen-Kot-fest gemacht werden und dann vielleicht auf utf-8 vorbereitet werden...

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. gudn tach!

            auch wenn das problem ja mittlerweile geloest wurde und dieser teilthread sich mit einem problem beschaeftigt, das eigentlich keiner in diesem thread hat, moechte ich wegen

            (Ich bitte um Berichtigungen)

            noch zwei kleine umformulierungen vorschlagen.

            $pattern = '=\bhttp://www\.([a-z0-9\-]{2,})\.tld/aktiv\.php\?domain\=\1&code\=\1\b=i';

            die delimiter sind vor allem deshalb variabel, damit man das maskieren moeglichst stark reduzieren kann. das gleichheitszeichen ist deshalb hier eher ungeschickt. besser waere bspw. die tilde.
            in character classes muss das minus-zeichen nicht maskiert werden, wenn es am anfang oder ende steht.

            somit koennte man drei zeichen sparen:
              ~\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b~i

            prost
            seth

            1. Hello seth,

              (Ich bitte um Berichtigungen)

              noch zwei kleine umformulierungen vorschlagen.

              für die ich mich bedanke.
              Die eine (Delimiter) habe ich mir schon gedacht, aber nicht weiter verfolgt...

              $pattern = '=\bhttp://www\.([a-z0-9\-]{2,})\.tld/aktiv\.php\?domain\=\1&code\=\1\b=i';

              die delimiter sind vor allem deshalb variabel, damit man das maskieren moeglichst stark reduzieren kann. das gleichheitszeichen ist deshalb hier eher ungeschickt. besser waere bspw. die tilde.
              in character classes muss das minus-zeichen nicht maskiert werden, wenn es am anfang oder ende steht.

              somit koennte man drei zeichen sparen:
                ~\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b~i

              ... und damit wahrscheinlich auch ein bisschen Power einsparen in der Reg-Exp-Maschine?
              Das wäre mir dann durchaus wichtig, gerade wenn man preg_match_all() oder ähnliche Schliefenkonstrukte benutzt.

              prost

              Das nehme ich jetzt wörtlich ;-)
              Gibt nur noch samstags das geliebte Hefeweizen. Ich muss abnehmen...

              Harzliche Grüße vom Berg
              http://bergpost.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

              1. gudn tach!

                somit koennte man drei zeichen sparen:
                  ~\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b~i

                ... und damit wahrscheinlich auch ein bisschen Power einsparen in der Reg-Exp-Maschine?

                ich weiss es nicht, aber vermute sehr stark, dass bei der geschwindigkeit hier kein merklicher unterschied auftreten sollte.

                Gibt nur noch samstags das geliebte Hefeweizen. Ich muss abnehmen...

                wobei bier gar nicht so sehr fuer dicke baeuche verantworlich ist, wie haeufig angenommen.
                http://images.zeit.de/text/2000/46/200046_stimmts.xml

                prost
                seth

        2. Hallo Tom,

          erst mal 1000 Dank für deine Mühe, dann evtl. zum Ausdruck VARIABEL noch eine Ausführung zum besseren Verständnis. Hiermit habe ich die Teile der URL bezeichnet die nicht immer gleich sind sondern in jeder neuen URL auch anders vergeben sind. Oder einfacher ausgedrückt an diesen URLs sind alle Zeichen Variabel mit Ausnahme von:

          /aktiv.php?domain=

          und

          &code=

          die in allen gefundenen URLs immer gleich sind. Auf eine Auflistung dessen was ich schon probiert habe wurde wohlweislich verzichtet ;-)
          Mein letzter Stand der eben auch nicht funktionierte war folgender:

          (nur der Suchstring)

          preg_match_all('/<a(.*?)href=['"]((http)s?://[^/ ]*(/[a-z0-9/-._%;,?&+[]=]*)?)'">(.*?)/im', $eingabe, $ausgabe, PREG_SET_ORDER);

          wobei die oben genannten feststehenden Begriffe mangels meiner Kenntnisse nicht berücksichtigt sind.

          Ich werde deine Version jetzt mal aufspielen und sehen was mir die Kiste liefert, das Ergebnis poste ich dann umgehend.

          Viele Grüsse
          Björn

          1. Hello,

            [...] zum Ausdruck VARIABEL noch eine Ausführung zum besseren Verständnis.

            Hiermit habe ich die Teile der URL bezeichnet die nicht immer gleich sind sondern in jeder
              neuen URL auch anders vergeben sind.

            Du hast aber nicht dazu gechreieben, ob das erste Vorkommen von "VARIABEL" einen anderen Wert repräsentieren soll, als das zweite und das dritte.

            Wenn die nämlich alle unterschiedlich sein dürfen, muss für die beiden im Instructor-Teil noch das Pattern geänsert werden. Da _dürfen_ dann alle Zeichen vorkommen, die z.B. urlencode() als Ergebnis liefern könnte, also auch Großbuchstaben, &, Semikolon, Unterstrich, usw.

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. Hallo Tom,

              Du hast aber nicht dazu gechreieben, ob das erste Vorkommen von "VARIABEL" einen anderen Wert repräsentieren soll, als das zweite und das dritte.

              Ja da gebe ich dir recht dies ist nicht eindeutig beschrieben. Diese VARIABEL Bezeichnungen sind völlig unterschiedliche Werte die von einem externen Script mit der URL übergeben werden.

              3 Beispiele für solche Rückgaben die in meinem Text vorkommen:

              http://www.allgemeines.info/aktiv.php?domain=tolledomain.de.vu&code=7114d

              http://besonderes.com/aktiv.php?domain=bloededomain.at&code=6654a

              http://www.spezielles.de/aktiv.php?domain=meinedomain.com&code=de44s

              Jetzt verständlicher?

              Danke und Grüsse
              Björn

              1. Hello,

                Du hast aber nicht dazu gechreieben, ob das erste Vorkommen von "VARIABEL" einen anderen Wert repräsentieren soll, als das zweite und das dritte.

                Ja da gebe ich dir recht dies ist nicht eindeutig beschrieben. Diese VARIABEL Bezeichnungen sind völlig unterschiedliche Werte die von einem externen Script mit der URL übergeben werden.

                3 Beispiele für solche Rückgaben die in meinem Text vorkommen:

                http://www.allgemeines.info/aktiv.php?domain=tolledomain.de.vu&code=7114d

                http://besonderes.com/aktiv.php?domain=bloededomain.at&code=6654a

                http://www.spezielles.de/aktiv.php?domain=meinedomain.com&code=de44s

                Jetzt verständlicher?

                Ich hatte Dich schon verstanden und diese Möglichkeit in Betracht gezogen, sonst hätte ich die substantieerende Frage nicht stellen können...

                Das bedeutet Für das Pattern aber, dass Du die Backrefernzen wieder rausnehmen und gegen einen Ausdruck austauschen musst, der die erlaubten Zeichen für diese Stellen darstellt.

                Harzliche Grüße vom Berg
                http://bergpost.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                1. Halo Tom,

                  jetzt funktioniert alles, vielen Dank für deine Mühe!!!!

                  Viele Grüsse
                  Björn

                  1. Hello,

                    jetzt funktioniert alles, vielen Dank für deine Mühe!!!!

                    Könntest Du uns für's Archiv dann bitte noch deinen teil des Patterns für den Parameter-Teil des URi posten?

                    Harzliche Grüße vom Berg
                    http://bergpost.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)