Frank S.: Automatisches Generieren von Links in PHP

Hallo zusammen,

Ich hab im Internet eine ganz nützliche PHP-Funktion gefunden, die in einem Text nach Teilen sucht, die wie Links aussehen und diese dann verlinkt:

function links($text) {  
  $text = html_entity_decode($text);  
  $p[] = '"(( |^)((ftp|http|https){1}://)[-a-zA-Z0-9@:%_+.~#?&//=]+)"i';  
  $r[] = '<a href="$1" target="_blank">\1</a>';  
  $p[] = '"( |^)(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)"i';  
  $r[] = '\1<a href="http://\2" target="_blank">\\2</a>';  
  $p[] = '"([_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3})"i';  
  $r[] = '<a href="mailto:\1">\\1</a>';  
  $text = preg_replace($p, $r, $text);  
  return $text;  
} 

Funktioniert soweit auch ganz gut, AAAAAABER sobald ich im Text einen Zeilenumbruch drin habe klappt es leider nicht mehr. Ich kenne mich mit regulären Ausdrücken leider nicht gut genug aus, um den Fehler zu finden.

Ich hab mal versucht, das <br /> was durch html_entity_decode generiert wird, zu entfernen, indem ich die zweite Zeile durch folgende ersetze:
$text = html_entity_decode(str_replace(array('<br />', '<br>', '<br/>'), '',$text));

Leider funktioniert es damit auch nicht.

Hat jemand eine Idee, wie ich die Funktion entsprechend anpassen könnte, damit sie auch bei Zeilenumbrüchen im Text funktioniert - ohne die Zeilenumbrüche zu entfernen?

  1. Hi Frank!

    Funktioniert soweit auch ganz gut, AAAAAABER sobald ich im Text einen Zeilenumbruch drin habe klappt es leider nicht mehr. Ich kenne mich mit regulären Ausdrücken leider nicht gut genug aus, um den Fehler zu finden.

    Definiere bitte mal "imt Text einen Zeilenumbruch haben". Am besten an einem Beispiel.

    Die Funktion untersucht den Text Zeile für Zeile. Und das reicht mMn auch, weil innerhalb eines Links ja kein Zeilenumbruch auftreten darf.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Definiere bitte mal "imt Text einen Zeilenumbruch haben". Am besten an einem Beispiel.

      Ich speichere den Text in einer mySQL Datenbank und beim Auslesen daraus kommt dann so etwas wie das hier heraus:

      bla bla bla bla blupp<br />www.yahoo.de

      Wenn du diesen String der Funktion mitgibst, kommt bei mir kein Link mehr heraus. Könnte natürlich auch sein, dass irgendwo noch ein \n\r steht, was ich so nicht sehe. ber auch der Versuch, so etwas abzufangen, ist mir nicht gelungen...

      1. Hi,

        bla bla bla bla blupp<br />www.yahoo.de

        Wenn du diesen String der Funktion mitgibst, kommt bei mir kein Link mehr heraus.

        Dein regulärer Ausdruck, der auf www.example.com matchen soll, sieht so aus:
        "( |^)(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)"i

        Er verlangt also, dass vor dem www entweder ein Leerzeichen, oder aber der absolute Beginn der Zeichenkette (da du ja nicht mal das MultiLine-Flag nutzt) stehen soll - ist aber bei obigem Beispieltext beides nicht (mehr) der Fall, also kein Treffer.

        Könnte natürlich auch sein, dass irgendwo noch ein \n\r steht, was ich so nicht sehe.

        Betreibe bitte *ernsthaftes* Debugging, und kein "könnte sein, vielleicht auch nicht".

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Dein regulärer Ausdruck, der auf www.example.com matchen soll, sieht so aus:
          "( |^)(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)"i

          Er verlangt also, dass vor dem www entweder ein Leerzeichen, oder aber der absolute Beginn der Zeichenkette (da du ja nicht mal das MultiLine-Flag nutzt) stehen soll - ist aber bei obigem Beispieltext beides nicht (mehr) der Fall, also kein Treffer.

          Stimmt, das war das Problem, habs jetzt so geändert:

          function links($text) {  
            $text = html_entity_decode($text);  
            $p[] = '"(( |^|\n)((ftp|http|https){1}://)[-a-zA-Z0-9@:%_+.~#?&//=]+)"i';  
            $r[] = '<a href="$1" target="_blank">\1</a>';  
            $p[] = '"( |^|\n)(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)"i';  
            $r[] = '\1<a href="http://\2" target="_blank">\\2</a>';  
            $p[] = '"([_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3})"i';  
            $r[] = '<a href="mailto:\1">\\1</a>';  
            $text = preg_replace($p, $r, $text);  
            return $text;  
          } 
          

          Danke für den Tipp!