Wie Beispiel 5. Hier wird jetzt jeder Begriff aber nur ein einziges Mal verlinkt.
Also wenn er das erste Mal im Text auftaucht.
Das ist sehr nützlich um z.B. automatisch in einem Glossar o.ä. Erläuterungen zu Fachbegriffen
anzubieten.
<?php
function cmp($a,$b)
{
$bool = strlen($a) < strlen($b);
return $bool;
}
function gimmeTheLink($k, &$map)
{
$r = '';
if (isset($map[$k])){
$r = $map[$k];
unset($map[$k]);
}else{
$r = $k;
}
return $r;
}
$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.
Gitarre oder Urwaldbaum, da fällt die Entscheidung doch leicht, oder?
Immer noch besser als Klopapier.
<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,'gimmeTheLink("\\1", $map)',$text);
echo $new;
?>