URL im Text intelligent erkennen

Juni 2010

Ein oft zu beobachtendes Problem ist die automatische Verlinkung von URLs in Texten wie Posts in Foren oder Kommentare in Blog. Ein Komma nach dem Link wird gerne mal als Teil der URL interpretiert und bei einer Klammer, die eigentlich zur URL gehört wird der Link ungewollt abgeschnitten.
Allerdings lässt sich dieses Problem einfach beheben, in dem man die URLs im Text analysiert bevor man den Link setzt. Die Callback-Funktion findUrl() übernimmt diese Aufgabe.

<?php
function findUrl($u){
  
$url $u[0];
  
$afterUrl ''// Zeichenkette am Ende der URL, die nicht zur URL gehört
  
while(preg_match('#[[:punct:]]$#'$url$found)){
    
$chr $found[0]; // letztes Zeichen
    
if($chr==='.' || $chr===',' || $chr==='!' || $chr==='?' || $chr===':' || $chr===';'){
      
// Ein Satzzeichen, das nicht zur URL gehört
      
$afterUrl $chr.$afterUrl;
      
$url substr($url0, -1);
    }
    elseif(
$chr===')' && strpos($url'(')!==false || $chr===']' && strpos($url'[')!==false || $chr==='}' && strpos($url'{')!==false)
      break; 
// Klammer gehört nur zur URL, wenn auch öffnende Klammer vorkommt.
    
elseif($chr===')' || $chr===']' || $chr==='}'){
      
// .. Klammer gehört nicht zur URL
      
$afterUrl $chr.$afterUrl;
      
$url substr($url0, -1);
    }
    elseif(
$chr==='(' || $chr==='[' || $chr==='{'){
      
// öffnende Klammer am Ende gehört nicht zur URL
      
$afterUrl $chr.$afterUrl;
      
$url substr($url0, -1);
    }
    else
      break; 
// Zeichen gehört zur URL
  
}
  
// URL mit HTML-Code zurückgeben
  
return '<a href="'.$url.'" title="'.str_replace('http://'''$url).'">'.$url.'</a>'.$afterUrl;
}
?>

Aufgerufen wird die Funktion über preg_replace_callback(), welche gleichzeitig die Ersetzung der Text-URL durch HTML-Code vornimmt:
<?php
// Alle URLs in $text erfassen und an findUrl() übergeben
$text preg_replace_callback('#https?://[^/\s]{4,}(/[^\s]*)?#s''findUrl'$text);
?>
In obiger Funktion werden nur HTTP- und HTTPS-URLs erfasst. Im Grunde liesse sich es auch auf FTP oder andere Protokolle ausweiten.

Beispiele mit normalem Ersetzen. Der verlinkte Abschnitt ist unterstrichen.
Das ist die Kurz-URL http://goo.gl/vGNV, die auf http://de.wikipedia.org/wiki/Iron_Man_(Film) verweist.
(Mehr Infos unter http://www.ironman-derfilm.de/)
Alle drei Links sind ungültig. Beim ersten wird das Komma mit genommen, beim zweiten fliegt die Klammer weg, beim dritten wird wiederum eine Klammer zuviel genommen.

Mit der obigen Analyse-Funktion werden die URLs nun aber wie folgt verlinkt:
Das ist die Kurz-URL http://goo.gl/vGNV, die auf http://de.wikipedia.org/wiki/Iron_Man_(Film) verweist.
(Mehr Infos unter http://www.ironman-derfilm.de/)
Hier werden keine Satzzeichen zu viel erwischt, jedoch fliegt die Klammer nicht weg, wenn sie es nicht sollte.
 

Andere Einträge



Kommentare

Es sind noch keine Kommentare vorhanden.

Kommentar hinzufügen



(wird nicht veröffentlicht)
(optional)