PHP - URLs erkennen und verlinken (per Regex)

Es gibt zahlreiche Fälle, in denen eine URL (also Internetadresse nach dem Motto http://www.phpbox) automatisch erkannt und als anklickbarer Link ausgegeben werden soll. Typisch ist dieser Fall für ein Forum, wo Nutzer die URL einfach als Text (also ohne HTML-Code) eingeben und bei der Ausgabe jede URL automatisch in ein Link umgewandelt wird.

Mit PHP läßt sich dies durch einen Regulären Ausdruck (kurz Regex für Regular Expression) erzielen, im konkreten Fall mit preg_replace(), das Text durchsucht und ersetzt. Um jede gefundene URL wird also der notwendige HTML-Code gelegt. Um die Anwendung einfacher zu machen, ist das Ganze in eine Funktion verpackt:

function autolink($str, $attributes=array()) {
  $attrs = '';
  foreach ($attributes as $attribute => $value) {
    $attrs .= " {$attribute}=\"{$value}\"";
  }
$str = ' ' . $str;
$str = preg_replace(
  '`([^"=\'>])(((http|https|ftp)://|www.)[^\s<]+[^\s<\.)])`i',
  '$1<a href="$2"'.$attrs.'>$2</a>',
  $str
);
$str = substr($str, 1);
$str = preg_replace('`href=\"www`','href="http://www',$str);
// fügt http:// hinzu, wenn nicht vorhanden
return $str;
}

In der Anwendung sieht die Funktion wie folgt aus:

$text="PHP-Infos finden sich auf http://www.php.net und zu preg_replace()auf http://www.php.net/manual/de/function.preg-replace.php";

echo $text;
echo "<br>";
echo autolink($text);

Ergebnis:

PHP-Infos finden sich auf http://www.php.net und zu preg_replace() auf http://www.php.net/manual/de/function.preg-replace.php
PHP-Infos finden sich auf http://www.php.net und zu preg_replace() auf http://www.php.net/manual/de/function.preg-replace.php

Zusätzlich erlaubt diese Funktion, die gefundenen Links mit Attributen wie target="_blank" oder ähnlichem auszugeben:

echo autolink($text,array("target"=>"_blank"));

Ergebnis:

PHP-Infos finden sich auf http://www.php.net und zu preg_replace() auf http://www.php.net/manual/de/function.preg-replace.php

Update

Der gleiche Effekt läßt sich auch mit der folgenden Funktion erzielen, die auch FTP-Links und eMail-Adressen in Links umwandelt (Danke an Matthias für den Hinweis):

function make_clickable($text)
{
return preg_replace('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0">\0</a>', $text);
}

zurück: Mehr PHP-Tipps & Tricks

Ergänzung? Fehler? Schreib uns an team@phpbox.de
Du findest phpbox.de nützlich? Wir freuen uns über einen Link auf phpbox.de

Einstieg in PHP 8 und MySQL
PHP Buch