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