Wie Beispiel 4. Hier können jetzt auch ganze Phrasen, also mehrere Wörter hintereinander, verlinkt werden.
Dazu wird das Array zusätzlich nach der Länge der Keys absteigend sortiert.
<?php
function cmp($a,$b)
{
$bool = strlen($a) < strlen($b);
return $bool;
}
$text = <<< EOT
Aus einem Urwaldbaum kann man viel unnützes Zeug herstellen.
Z.B. Essstäbchen, Klopapier, Schrankwände oder Fensterrahmen.
Möchte man aber etwas wirklich sinnvolles damit tun kann man
aber auch eine Gitarre daraus bauen.
<img src="/gfx/gitarre.jpg" alt="Gitarre" title="Gitarre aus einem Urwaldbaum, um ein Haar wäre aus dem Holz Klopapier geworden.">
EOT;
$targets = array(
'Urwaldbaum' => 'http://de.wikipedia.org/wiki/Urwald',
'Klopapier' => 'http://www.umwelt.org/robin-wood/german/trowa/urwaldpapier/index.htm',
'Gitarre' => 'http://de.wikipedia.org/wiki/Gitarre',
'viel' => 'http://www.pril.de',
'Zeug' => 'http://www.zeug.de',
'viel unnützes Zeug' => 'http://www.ebay.de',
'etwas wirklich sinnvolles' => 'http://www.internetabschalten.de',
);
$map = array();
foreach ($targets as $k => $v){
$key2use = preg_quote($k);
$map[$key2use] = sprintf('<a href="%s">%s</a>', $v, $k);
}
uksort($map, 'cmp');
$tmp = '(\b'.join ('\b|\b', array_keys($map)).'\b)';
$regexp = "/".$tmp."(?![^<]+>)/e";
$new = preg_replace($regexp,'$map["\1"]', $text);
echo $new;
?>