<?php
/**
In einem Text Begriffe verlinken um Querverweise zu realisieren.
*/
function crossreference($targets, $text)
{
$map = array();
$stack = array();
// bereits vorhande Verlinkungen im Text schuetzen ...
$success = preg_match_all('#(<a.*</a>)#Ui',$text, $matches);
if($success){
$stack = array_combine(array_map('md5', $matches[0]), $matches[0]);
$text = str_replace($stack, array_keys($stack), $text);
}
foreach ($targets as $k => $v){
$key2use = preg_quote($k);
$map[$key2use] = sprintf('<a href="%s">%s</a>', $v, $k);
}
uksort($map, create_function('$a,$b', 'return strlen($a) < strlen($b);'));
$tmp = '(\b'.join ('\b|\b', array_keys($map)).'\b)';
$regexp = "/".$tmp."(?![^<]+>)/e";
$lamda = create_function('$k, &$map',
'$r="";
if (isset($map[$k])){
$r = $map[$k];
unset($map[$k]);
}else{
$r = $k;
}return $r;');
$s = preg_replace($regexp, '$lamda(\'\1\', $map)', $text);
// die urspruenglichen Verlinkungen wieder einsetzen ...
$s = str_replace(array_keys($stack), $stack, $s);
return $s;
}
$text = <<< EOT
<a href="http://example.org">Aus einem Urwaldbaum</a> 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 <a href="http://gibson.com">Gitarre</a> 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',
);
$new = crossreference($targets, $text);
echo $new;
?>
Dieses PHP Snippet soll in erster Linie als Beispiel und Anregung für eigene Bemühungen dienen.
Gerne darf man es für Projekte aller Art benutzen.
Möchte jemand das Snippet also solches in ähnlicher oder anderer Form veröffentlichen ist ein kleiner Hinweis auf simplecontent.net nicht zuviel verlangt oder Herr Koch?
Für die Abwesenheit von Fehlern kann natürlich keine Gewähr gegeben werden.