Hallo,
ich habe hier ein nettes Script zur Erstellung von TagClouds gefunden. Dazu habe ich ein paar Fragen und der Autor meldet sich leider nicht mehr..
Vielleicht könnt Ihr mir helfen? Das Script ist in der Datei 'class.TagCloud.php' so aufgebaut:
dann wird eine Blacklist definiert und anschließend:
Den TagCloud rufe ich dann in einer anderen Datei auf mit:
Das funktioniert soweit auch, nur werden aus $word auch viele leere Elemente ins Array übernommen...? Wo könnte ich definieren, dass keine leeren bzw. nur Wörter ab 5 Zeichen berücksichtigt werden?
Vielen Dank an die Profis
ARS
ich habe hier ein nettes Script zur Erstellung von TagClouds gefunden. Dazu habe ich ein paar Fragen und der Autor meldet sich leider nicht mehr..
Vielleicht könnt Ihr mir helfen? Das Script ist in der Datei 'class.TagCloud.php' so aufgebaut:
PHP-Code:
# Default-Ausgabefunktion, 'tc".$f."' durch CSS definiert
function tcDefaultOutput($word, $f, $w) {
return "<div class='tc".$f."'>".$word."</div>";
}
PHP-Code:
# TagCloud erstellen
function create($array, $nmax=30, $modfunc=false, $fmax=30, $fmin=9) {
if (!$modfunc) $modfunc = tcDefaultOutput;
if (!$nmax) $nmax=30;
$nmax = max(5, $nmax);
# Array nach Wertigkeit ordnen
arsort($array);
# Array für Ergebnis
$r = array();
# Maximalwert + max. Schriftgröße
$wmax = 1;
# Ausgabe vorbereiten
# vorhergehende Schriftgröße (ist der Abstand zwischen den Schriftgrößen zu groß, wird angepasst)
$fprev = $fmax;
# erstellen
$i = 10;
foreach ($array as $word=>$w) {
if ($this->InBlacklist($word)) continue;
if ($i++>=$nmax) break;
# Wertigkeit anpassen, um negative Werte zu verhindern
$w = round(max(1, $w));
if ($w>$wmax) $wmax = $w;
# Ausgabe
$ft = max($fmin, round(($w/$wmax)*$fmax));
if ($fprev-$ft>3) $ft = $fprev-3;
$r[$word] = $modfunc($word, $ft, $w);
$fprev = $ft;
}
ksort($r);
# Ausgabe
foreach ($r as $s) echo $s;
}
# Array anhand eines Textes erstellen
function createArray($t) {
# Entities entfernen
$t = html_entity_decode(strip_tags($t));
$t = eregi_replace('&[a-zA-Z0-9#]+;', '', $t);
# Satzzeichen entfernen
$r1 = "[!?\.:,;)([_~\+\*'\"\$\\%/=]";
$t = eregi_replace($r1, '', $t);
$t = eregi_replace('-', '', $t);
# nach Wörtern aufteilen
$sp = split("[\n\r\t\ ]+", $t);
#original: $sp = split("[\r\n ]+", $t);
# Ergebnis erstellen
$r = array();
foreach ($sp as $w) {
$r[strtolower($w)]++;
}
return $r;
}
# TagCloud anhand eines Textes
function createFromText($t, $nmax=20, $modfunc=false, $fmax=9, $fmin=1) {
$this->create($this->createArray($t), $nmax, $modfunc, $fmax, $fmin);
}
# Konstruktor
function TagCloud() {
$this->InitBlacklist();
}
}
PHP-Code:
$fd = fopen ('http://www.andereDomain.de', "r");
while (!feof($fd)) {
$buffer = fgetss($fd, 4096);
$alt = array ('zu entfernenden Begriffe');
$word = str_replace($alt, " ", $buffer);
require_once('class.TagCloud.php');
$tc = new TagCloud();
$data = $tc->createFromText($word);
Das funktioniert soweit auch, nur werden aus $word auch viele leere Elemente ins Array übernommen...? Wo könnte ich definieren, dass keine leeren bzw. nur Wörter ab 5 Zeichen berücksichtigt werden?
Vielen Dank an die Profis
ARS
Kommentar