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.
Aufgerufen wird die Funktion über preg_replace_callback(), welche gleichzeitig die Ersetzung der Text-URL durch HTML-Code vornimmt:
Beispiele mit normalem Ersetzen. Der verlinkte Abschnitt ist unterstrichen.
Mit der obigen Analyse-Funktion werden die URLs nun aber wie folgt verlinkt:
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($url, 0, -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($url, 0, -1);
}
elseif($chr==='(' || $chr==='[' || $chr==='{'){
// öffnende Klammer am Ende gehört nicht zur URL
$afterUrl = $chr.$afterUrl;
$url = substr($url, 0, -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.(Mehr Infos unter http://www.ironman-derfilm.de/)
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.
(Mehr Infos unter http://www.ironman-derfilm.de/)
Andere Einträge
- strtocamelcase() - CamelCase
- is_utf8() – auf UTF-8 prüfen
- array_map_recursive()
- href und URL zusammensetzen
- Array-Zeiger auf bestimmten Key setzen
Kommentare
Es sind noch keine Kommentare vorhanden.