WauWau: Links erkennender Pattern

Hola,

mal wieder ein gähnend langweiliges Threads über Links erkennende Reguläre Ausdrücke.

Also, momentan benutze ich (an einer irrelevanten Stelle) sowas:

#(^|[^"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sm

Handelt aber .... irgendwie komisch. Habe ich von irgendwo von http://www.php.net.

Erkennen würde ich gerne auch Links, die nur mit www. beginnen.
Und ich brauche auch nur http und ftp.

Zusammengebastelt habe ich mir schon folgendes:

/(http://|ftp://|www.)([a-zA-Z0-9.-]+)([a-zA-Z0-9/\.-?]+)?/i

Hmm... das findet schonmal etwas, das mit http://, ftp:// oder www. beginnt, und einen Hostnamen danach. Aufhören tud es beim folgenden dateinamen. Denn da ist ja erst schonmal ein "/" oder "" drin, oder punkte, dann ? für nen Querystring, dazu gehört dann auch schon wieder & und =, usw. usw... Da ist es doch unmöglich, zwischen:

"Hieß die Domain www.google.de?Oder dann doch www.ich-gleich-du.de?"

und

"Bla: http://www.sonstwas.de/ich/du/er?sie=es"

zu unterscheiden....

Mit Begrenzungszeichen ("bla: [www.bla.de]") möchte ich nicht arbeiten. Hat jemand eine Idee, was sich da machen ließe? Welche Zeichen sind eigentlich überhaupt alle bei einem Dateinamen erlaubt? Im Query-string afaik nur "=", "&" und "+" (und das davorstehende "?"), alles andere müsse maskiert werden.

WauWau

--
ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
E-Mail WauWau: [mailto:der-wauwau@gmx.de]
  1. Es ist generell sehr schwierig, so was automatisch festzustellen, weil es einfach zu viele Möglichkeiten gibt.
    Z.b. würdest du "forum.de.selfhtml.org" ohne ein http:// niemals als Link interpretieren können, da du nie sicher sein kannst, dass es sich bei dem Geschriebenen auch wirklich um eine URL handelt.
    Das Thema geht übrigens schon sehr in Richtung AI, und läßt sich mit solch simplen Regular Expressions wie PCRE wohl kaum mehr machen.

    Deshalb würde ich mir an deiner Stelle keine grauen Haare wegen einer "perfekten Erkennung" wachsen lassen und stattdessen lieber einfach ein RegExp wie das hier nutzen:

    /((http://|ftp://|www.|ftp.)\S+?)\s/i

    Alles ab dem Anfangskeywort bis zum nächsten Whitespace (Leerzeichen, Zeilenumbruch, etc) wird als URL-String interpretiert.
    Übrigens enthält hier die 1. gematchte Gruppe den vollständigen URL-String, d.h. du kannst ihn später einfach abfragen.

    1. Hallo cn,

      Es ist generell sehr schwierig, so was automatisch festzustellen, weil es einfach zu viele Möglichkeiten gibt.
      Z.b. würdest du "forum.de.selfhtml.org" ohne ein http:// niemals als Link interpretieren können, da du nie sicher sein kannst, dass es sich bei dem Geschriebenen auch wirklich um eine URL handelt.

      Ganz genau. Deswegen soll es dann ja auch in diesem Fall nur interpretiert werden, wenn ein http:// davor steht. Meine kleine "Erweiterung" war nur, auch etwas wie www.google.de zu erkennnen. Immerhin ist so ein "www." davor auch ziemlich .. naja, sagen wir mal es kommt oft vor ;-)

      Das Thema geht übrigens schon sehr in Richtung AI, und läßt sich mit solch simplen Regular Expressions wie PCRE wohl kaum mehr machen.

      Hmmm... Ja, wenn man den Script intelligent mitdenken lassen will, nicht... *schade* ;-) - warten wir einfach noch ein paar jährchen und bauen dann nen robotor an unseren server drank ;-)

      Deshalb würde ich mir an deiner Stelle keine grauen Haare wegen einer "perfekten Erkennung" wachsen lassen und stattdessen lieber einfach ein RegExp wie das hier nutzen:

      /((http://|ftp://|www.|ftp.)\S+?)\s/i

      Alles ab dem Anfangskeywort bis zum nächsten Whitespace (Leerzeichen, Zeilenumbruch, etc) wird als URL-String interpretiert.
      Übrigens enthält hier die 1. gematchte Gruppe den vollständigen URL-String, d.h. du kannst ihn später einfach abfragen.

      Na das hätte ich ach noch auf die Reihe bekommen ;-)

      na gut, mal sehen was sich machen lässt ;-)

      WauWau

      --
      ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
      E-Mail WauWau: [mailto:der-wauwau@gmx.de]
      1. Hallo.

        Immerhin ist so ein "www." davor auch ziemlich .. naja, sagen wir mal es kommt oft vor ;-)

        Dann solltest du zumindest noch eine Liste dergültigen TLD unterbringen.
        MfG, at

        1. Hallo at,

          Immerhin ist so ein "www." davor auch ziemlich .. naja, sagen wir mal es kommt oft vor ;-)
          Dann solltest du zumindest noch eine Liste dergültigen TLD unterbringen.

          afaik gibts da aber eine ganze Menge, wenn ich die alle per (?:de|at|com|bla|blo|bli|ble|blu|ble|...) aufzählen würde... wäre mein Pattern am Ende so eine halbe Seite lang ;-)

          WauWau

          --
          ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
          E-Mail WauWau: [mailto:der-wauwau@gmx.de]
          1. Hallo.

            afaik gibts da aber eine ganze Menge, wenn ich die alle per (?:de|at|com|bla|blo|bli|ble|blu|ble|...) aufzählen würde... wäre mein Pattern am Ende so eine halbe Seite lang ;-)

            Fauler Sack! ;-)
            MfG, at

            1. Hallo at,

              afaik gibts da aber eine ganze Menge, wenn ich die alle per (?:de|at|com|bla|blo|bli|ble|blu|ble|...) aufzählen würde... wäre mein Pattern am Ende so eine halbe Seite lang ;-)

              Fauler Sack! ;-)

              Ist die Frage, ob ich faul bin, oder der Server evv. dadurch... zu viel ausgelastet ist ;-) - oder ist es für ihn keine Auslastung, auf einen 1MB-großen String einen 20KByte-großes Suchmuster zu prüfen/testen/....? ;-)

              WauWau

              --
              ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
              E-Mail WauWau: [mailto:der-wauwau@gmx.de]