klaus: ^ klappt nicht bei regulären ausdrücken in php

hallo forum,

ich versuche gerade eine url mit regulären ausdrücken zu "erkennen".

jetzt dachte ich mir, daß zumindest eine http://.... mit folgendem muster erkannt werden müßte:

$pattern = ("/^http:///i");

dummerweise habe ich probleme mit dem "dach"-> ^ <-
sobald ich das einfüge wird http:// nicht mehr erkannt ??

mal ne ganz blöde frage... das ist schon die taste,
die links neben der eins und oberhalb der tab-taste liegt, oder?

grüße und danke für eure hilfe,

klaus

  1. Hi,

    $pattern = ("/^http:///i");

    Ich kenn mich mit dem PHP nicht aus, deshalb kann es sein, das ich mich irre, aber ich würde mal vermuten, das das eine Substitution ist, die irgendwo anders dann zum Einsatz kommen soll (so wärs zumindest in Perl, kann sein, das das in PHP anders ist).
    Wenn ja, dann werden die / bereits hier interpoliert und bei der Substitution kommt nur noch /^http:///i an, was ja nicht funktionieren dürfte. Ich würde probieren, $pattern = ("/^http:\/\//i"); zu schreiben, oder (wenn das in PHP unterstützt wird) das ganze in Hochkommas ('/^http:///i') zu setzen.

    mfg. Maik

    1. Hi,

      $pattern = ("/^http:///i");

      Ich kenn mich mit dem PHP nicht aus, deshalb kann es sein, das ich mich irre, aber ich würde mal vermuten, das das eine Substitution ist, die irgendwo anders dann zum Einsatz kommen soll (so wärs zumindest in Perl, kann sein, das das in PHP anders ist).
      Wenn ja, dann werden die / bereits hier interpoliert und bei der Substitution kommt nur noch /^http:///i an, was ja nicht funktionieren dürfte. Ich würde probieren, $pattern = ("/^http:\/\//i"); zu schreiben, oder (wenn das in PHP unterstützt wird) das ganze in Hochkommas ('/^http:///i') zu setzen.

      mfg. Maik

      hi maik,

      danke für deine hilfe, aber ich habe mittlerweile das gefühl das es an den ^liegt - der wird ums verrecken nciht erkannt !

      Bsp:

      $text=Dies ist ein Blindtext mit einem link: http://www.heise.de    noch eine zeile....

      $pattern= "/^http*/i";
       $found=preg_match($pattern,$text);

      if($found==1){echo "<p><b>Link gefunden!</b></p>"; } else
                      {echo "<p><b>KEINEN Link gefunden</b><p>"; }

      und so finde ich keinen link ?? nicht mal auf diese simple art und weise ???

      aus Jörg Krause - PHP4:
      Zitat: "^Skript" - Mit der Kennzeichnung wird erreicht, dass alle Zeichenketten erkannt werden, die mit den Zeichen "Skript" beginnen;
      ^ steht für den Wortanfang, erkannt werden bspw:
      Skript, Skripts, Skriptsprache.... -Zitat Ende

      wiso erkennt dann mein skript nicht http://www.xy.de ???
      ich verstehe es einfach nicht !!
      oder bin ich echt zu blöd die richtige dachtaste zu treffen? die links oben im eck ist es doch oder??
      hilfe....

      grüße klaus

      1. Hi,

        $pattern = ("/^http:///i");

        versuchs mal mit einzelnen Hochkommata: $pattern = ('/^http:///i');

        oder bin ich echt zu blöd die richtige dachtaste zu treffen? die links oben im eck ist es doch oder??

        Die Taste stimmt schon.

        Schönen Gruß

        Rainer

        1. Hi Rainer,

          $pattern = ("/^http:///i");

          versuchs mal mit einzelnen Hochkommata: $pattern = ('/^http:///i');

          ich habe das ganze mal in hochkommata gesetzt,
          aber viel geändert hat sich da nicht ;-(
          ich glaube aber , ich hab rausbekommen, wiso es nicht klappt:
          ^xxx sucht nur am zeilenanfang nach einem ausdruck.

          wenn ich also in "Blindtext http://www.heise.de Blindtext" nach http://www.heise.de suche, wird es nicht gefunden werden...

          wie kann ich aber nun meinen ausdruck schreiben,
          das der GANZE ausdruck http://www.heise.de gefunden wird und ersetzt werden kann ??

          grüßé klaus

          1. Hoi Klaus

            Jetzt wollte ich Dir gleich schreiben, was Du selbst herausgefunden hast. :-)

            Ich bin daran im PHP Buch nachzulesen. Ich denke aber Du musst folgendermassen vorgehen: Du willst den ganzen URL.

            Der Beginnt mit=http und endet mit=LEERSCHLAG und zwar immer. Eigentlich sollte man das doch in eine Reg-Exp packen können ;-)

            HTH
            kaepten

            1. Hoi Klaus

              Der Beginnt mit=http und endet mit=LEERSCHLAG und zwar immer. Eigentlich sollte man das doch in eine Reg-Exp packen können ;-)

              Ok, vielleicht nicht immmer, aber meistens endet die URL mit einem Leerschlag.

              Folgender Code funtzt bei mir:

              $text="Dies ist ein Blindtext mit einem link: http://www.heise.de und nachfolgendem Text";

              $pattern = "/http.+? /";
              $resultat = preg_replace($pattern, "Ersatztext ", $text);
              echo $resultat;

              HTH
              kaepten

              1. $pattern = "/http.+? /";
                $resultat = preg_replace($pattern, "Ersatztext ", $text);
                echo $resultat;

                hi kaepten,

                also wenn das klappt, dann bekomm ich einen heulkrampf:
                für die 3 zeilen lausigen code hab ich mir die nacht um die ohren gehauen... ;-))

                das mit dem leerzeichen hab ich mir auch überlegt, zumal man ja auch eines vornedran setzen könnte.
                aber ich habe nirgendwo was gefunden, wie man ein leerzeichen maskiert (vielleicht ein backslash..)

                müßte da vor das hintere leerzeichen nciht noch ein $ ?
                um dem ausdruck zu sagen, das das letzte zeichen ein blank ist?

                kanns hier auf der arbeit gerade nicht ausprobieren, deswegen frage ich.. ;-))

                vielen dank !!
                grüße klaus

                1. Hoi Klaus

                  also wenn das klappt, dann bekomm ich einen heulkrampf:
                  für die 3 zeilen lausigen code hab ich mir die nacht um die ohren gehauen... ;-))

                  Es klappt, ich hätts Dir nicht geschrieben, wenn hier bei mir nicht gelaufen wäre! :-)

                  das mit dem leerzeichen hab ich mir auch überlegt, zumal man ja auch eines vornedran setzen könnte.
                  aber ich habe nirgendwo was gefunden, wie man ein leerzeichen maskiert (vielleicht ein backslash..)

                  müßte da vor das hintere leerzeichen nciht noch ein $ ?
                  um dem ausdruck zu sagen, das das letzte zeichen ein blank ist?

                  Soweit ich meine musst Du Leerzeichen nicht maskieren. Aber hierzu hilft auch SelfHTML im Kapitel PERL weiter, denn die Reg-Expressions sind vorwiegend gleich.

                  Ich habe aber noch einen Link gefunden der Dich interessieren könnte : 6.8. Wie finde ich alle Links in einer HTML-Datei? http://www.dclp-faq.de/q-regexp-links-finden.html Es entspricht nicht exakt Deinem Beispiel aber beinahe .

                  Gruss
                  kaepten

                  1. Es klappt, ich hätts Dir nicht geschrieben, wenn hier bei mir nicht gelaufen wäre! :-)

                    *heul*

                    Ich habe aber noch einen Link gefunden der Dich interessieren könnte : 6.8. Wie finde ich alle Links in einer HTML-Datei? http://www.dclp-faq.de/q-regexp-links-finden.html Es entspricht nicht exakt Deinem Beispiel aber beinahe .

                    sieht gut aus, ich habe auf derselben seite auch folgendes gefunden:
                    http://www.dclp-faq.de/q-regexp-uri-klickbar.html allerdings klappt dieses beispiel nicht bei mir...

                    aber die 6.8 sieht gut aus... melde mich heute abend nochmal ,
                    wenn ich das ausprobieren kann.. DANKE !!!

                    grüsse klaus

                    1. Hallo Klaus

                      sieht gut aus, ich habe auf derselben seite auch folgendes gefunden:
                      http://www.dclp-faq.de/q-regexp-uri-klickbar.html allerdings klappt dieses beispiel nicht bei mir...

                      Den hab ich gar nicht gesehen - der ist ja noch besser! Der macht genau das was Du willst...

                      Bei mir funtzt es. Wie hast Du es den verwendet? Machs probehalber mal so:

                      function replace_uri($str) {
                        $pattern = '#(^|[^"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sm';
                        return preg_replace($pattern,"\1<a href="\2\3"><u>\2\3</u></a>\4",$str);
                      }

                      $str = "Blindtext http://www.heise.de Blindtext";
                      echo replace_uri($str);

                      Das klappt jedenfalls bei mir prima.

                      Gruss
                      kaepten

              2. Hi,

                $pattern = "/http.+? /";

                an dieser Stelle würde ich $pattern = "/http[^ ]/"; empfehlen, da es kein Backtracking verursacht und somit schneller laufen wird (auch wenn sich das bei kleinen Texten kaum auswirken wird).
                Das ^ an dieser Stelle bewirkt, das die Zeichenkette in den [] negiert wird, es steht also nicht für Zeile- oder Stringanfang.

                Irgendwo später hatte ich noch die Frage mit dem $ gelesen.
                ^ und $ stehen für Zeilen/String-Anfänge/Enden nicht für Wortgrenzen. Dafür sind < > oder \b da (je nach dem, was von PHP unterstützt wird).

                mfg. Maik