[PHP] Links automatisch umwandeln

27o8

abgemeldet
2 Mai 2006
9.028
933
Habe diese Funktion bei Google gefunden:

PHP:
function link2click($str)
{
  $s_patter[]='"(( |^)((ftp|http|https){1}://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)"i';
  $r_patter[]='<a href="\1" target="_blank">\\1</a>';
  
  $s_patter[]='"( |^)(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)"i';
  $r_patter[]='\\1<a href="https://\2" target="_blank">\\2</a>';
  
  $s_patter[]='"([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})"i';
  $r_patter[]='<a href="mailto:\1">\\1</a>';
  
  $str=preg_replace($s_patter,$r_patter,$str);
  return $str;
}
Muss dazu sagen, dass ich keine Ahnung von Regexp habe. Habe mich einfach noch nicht damit befasst :-?. Aber diese Funktion wandelt meinen Link einfach nicht um :cry: Warum?

*edit*
Auf Grund der Nachfrage per Reno:

Die Funktion soll automatisch Links in einem String z.B. www.google.de in Links <a href="https://www.google.de">www.google.de</a> umwandeln.
 
Zuletzt bearbeitet:
Teste die Dinger doch mal einfach und nicht gleich alle zusammen. Die Ersetzungsstrings stimmen sicher nicht, weil einmal \\1 und einmal \1 steht.

Nur mal den ersten RegExp angesehen, der müsste schon fast matchen. Allerdings verlangst du ein Protokoll, was bei www.google.de nicht gegeben is.
Code:
(( |[COLOR=Red]^[/COLOR])([COLOR=Magenta](ftp|http|https){1}[/COLOR]://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)
^www(noMatch:Abbruch).google.de
Code:
(( |[COLOR=Red]^[/COLOR])((ftp|[COLOR=Magenta]http[/COLOR]|https)[COLOR=Magenta]{1}[/COLOR][COLOR=DarkOrange]://[/COLOR])[COLOR=Blue][-a-zA-Z0-9@:%_\+.~#?&//=]+[/COLOR])
^http://www.google.de (match)

Dafür matcht hier der zweite RegExp
Code:
( |[COLOR=Red]^[/COLOR])([COLOR=Magenta]www[/COLOR][COLOR=DarkOrange].[/COLOR][COLOR=Blue][-a-zA-Z0-9@:%_\+.~#?&//=]+[/COLOR])
^www.google.de (match)
(Vorsicht: Der Punkt (orange) matcht zwar, sollte aber escapt werden, da sonst jedes Zeichen matcht. wwwxgoogle.de matcht auch!)

Die äußere Klammer kann man sich btw. sparen, weil der komplette Ausdruck immer in $match[0] steht.
 
Ja, und im zweiten $r_pattern steht da leider als erste Selbstreferenz ein \2 statt einem \\2. Könntest Du diese Selbstreferenzen nicht in $1, $2 etcetera umwandeln? Die doppelte Backslasherei ist erfahrungsgemäß fehleranfällig ...

PHP: preg_replace
replacement darf Referenzen in der Form \\n oder (ab PHP 4.0.4) $n enthalten, wobei Letztere vorzuziehen ist.