preg_replace - E-Mail-Adressen und URLs zu Links machen

Daxi

Erfahrenes Mitglied
Hallo!
Ich bin dabei mir eine kleine Community zu schreiben.
Derzeit hänge ich leider am Problem preg_replace für URLs und E-Mail-Adressen.
Ich will das ganze auf zwei Wege machen.
1. BBCode (funktioniert bestens)
2. Automatisch erkennen

Welche preg_replaces brauche ich dafür?
Ich möchte das so möglich machen:
- http://domain.de wird zu Link
- http://www.domain.de wird zu Link
- info@domain.de wird zu Link

Zu beachten ist dabei nur, dass ich vorher (bevor ich die BBCode ersetze) dem Text Linebrakes einfüge.
PHP:
$t = str_replace("\r\n","<br>\r\n",$t);

Kann mir von euch jemand weiterhelfen?
Ich habe mir zwar ein Buch über PHP4 gekauft, komme aber trotzdem nicht ganz mit der Patternsyntax klar.
Im original PHP-Handbuch ist gerade diese Seite englisch... *#@!
 
*freu* wieder was für mich :)

Suchpattern für die autmatische URL-Erkennung:

$pattern_mit_und_ohne_http = "/[http:\/\/]?(([a-z0-9][a-z0-9_-]*)(\.[a-z0-9_-]+)+\/?(.*))/i";

$pattern_email = "/[a-z0-9_-.]@[a-z0-9][a-z0-9_-]*(\.[a-z0-9]+)+/i";

musst mal testen. Bin nicht mehr in der Lage noch meine Augen wachzuhalten ;-)

Dürfte aber funktionieren, wenn nicht, sag bescheid :)
 
Ich hab jetzt ein kleines Problem (klein für dich):
Setze ich dein URL-Pattern ein, so wird eine E-Mail-Adresse z.B. zu: info@(link).
2. steht hinter der domain noch ein Text, so gehört der für das Pattern noch mit dazu.

Ich hätte das gerne noch etwas modifiziert.
Es sollen die Protokolle http:// und ftp:// erlaubt sein.
Das wäre doch dann am Anfang dann sowas in der Richtung: [http:\/\/|ftp:\/\/] kann ich jetzt irgendwie herausfinden, ob da jetzt http:// oder ftp:// davorsteht, oder geht das nur mit (.*?){3,4}:\/\/(.*?), sodass ich \1 = Protokol und \2 = Seite etc. habe?

edit:
Ich habs jetzt soweit umschreiben können:
PHP:
$t = preg_replace("(\\s)(http:\\/\\/|ftp:\\/\\/|www\\.)(([a-z0-9][a-z0-9]*)([\\.a-z0-9_-]+)+\\/?(.*))#ie",
"\\\\1<a href=\\"\\\\2\\\\4\\\\5\\" target=\\"_blank\\">\\\\2\\4\\\\5</a>\\\\6",$t);
Das funktioniert jetzt so, dass ich den Text davor und dahinter auch noch als normalen Text habe.
Nur ein Problem besteht jetzt noch.
ist die Domain nur mit http://www. geschrieben, so muss eigentlich im Link am Anfang ein http:// stehen. Wie bekomme ich das jetzt hin? geht das direkt im Pattern oder muss ich dafür das Patter mit dem Modifier e machen und den Link dann von einer Funktion erstellen lassen, die bei einem http://www. http://www. daraus macht?

Im Klartext:
PHP:
$t = preg_replace("(\\s)(http:\\/\\/|ftp:\\/\\/|www\\.)(([a-z0-9][a-z0-9]*)([\\.a-z0-9_-]+)+\\/?(.*))#ie",
"bbc_link('\\1','\\2','\\4','\\5','\\6');",$t);

function bbc_link($a,$b,$c,$d,$e) {
 $c = $a;
 $b = ($b == "www.") ? "http://www." : $b;
 $c .= "<a href=\"".$b.$c.$d."\" target=\"_blank\">".$b.$c.$d."</a>".$e;
 return $c;
}

Dieser Code müsste eigentlich den gewünschten Erfolg bringen. Geht es auch einfacher?
 
Zuletzt bearbeitet:
Ich habs jetzt geschafft.
PHP:
$t = preg_replace("#(http:\\/\\/|ftp:\\/\\/|www\\.)(([a-z0-9][a-z0-9]*)([\\.a-z0-9_-]+)+\\/?(.*))#ie",
"'<a href=\\"'.(('\\\\1' == 'www.') ? 'http://' : '').'\\\\1\\\\3\\\\4\\" target=\\"_blank\\">\\\\1\\\\3\\\\4</a>\\\\6'",$t);

Das funktioniert jetzt.
Danke für deine Hilfe.
Jetzt schau ich mal zwecks E-Mail-Adressen...

edit:
Ich habe das Pattern nochmal editiert.
Es findet jetzt einwandfrei die URLs und E-Mail-Adressen.
Kann ich irgendwie definieren, dass vor der Adresse nicht ], =, " sein dürfen und dahinter kein [, ], " sein darf?
Ich will also diese Zeichen ausschließen.
Wie geht sowas?
 
Zuletzt bearbeitet:
diese Zeichen schließen sich normalerweise bei dem Emailpattern automatisch aus, da ich nur Buchstaben von a - z und Zahlen sowie Unterstrich und Bindestrich erlaube

achso, die Anweisung "e" am Ende deines HTML-Patterns brauchst du nicht wirklich, da du ja keinen Programmcode verwendest. Stattdessen schreib ein "x" hin, dadurch werden alle Whitespacezeichen ( Leerzeichen, Zeilenumbrüche etc.) ignoriert solange sie nicht klar definiert worden sind.
 
Zurück