Bis 50 Worte, dann Link

nordi

Erfahrenes Mitglied
Tach,

boah - das ist mal ne kreative Überschrift ;)
Also, folgendes Problem. Ich habe eine Shoutbox für kleinere Einträge auf meiner Seite und ein Gästebuch. Da das Gästebuch nicht in Vergessenheit geraten soll, würde ich gerne Einträge aus dem Gästebuch in der Shoutbox zeigen. Diese sollen aber nur bis 50 oder 30 Worte gehen und danach ein Link kommen mit "mehr im Gästebuch" oder so ähnlich. Ich kenn das aus Newsscripts, wenn man dort einen längeren Artikel schreibt, kommt dann ein Link (wie zB. read more) um den ganzen Artikel anzuzeigen.

Wie würdet ihr das regeln? Die Einträge sind alle in einer MYSQL-Datenbank gespeichert.
 
Hi,

das funktioniert relativ einfach mit der funktion wordwrap

bsp:

Code:
                    $eintrag = $row->inhalt;
                    if (strlen($eintrag) > 800) { 
                    $eintrag = wordwrap($eintrag, 800, "#");
                    
              
                    $data = explode ("#", $eintrag);
                    $eintrag = $data[0] . " ...<br><a href=\"news.php?id=".$row->id."&comments=1\" title=\"Komplette News anzeigen\"><img src=\"$basehref/px/gfx/more.gif\" border=\"0\"></a></div>";
                    }
                    else { }
 
Ich würde nicht die Worte zählen sondern eine Maximalanzahl von Zeichen festlegen z.b. 300 und dann ab dieser Position rückwärts nach einem Leerzeichen suchen.
Dann nimmst du alle Zeichen bis zu diesem Leerzeichen (eben das letzte vor der 300-Zeichen-Marke).
Damit ist der Eintrag dann niemals länger als 300 Zeichen und endet immer mit einem vollständigen Wort.
Das Durchlaufen durch alle Leerzeichen kannst Du Dir dann sparen
Evtl. solltest Du aus Performance-Gründen eine weitere Spalte in die MySql-Tabelle einfügen, die Kurzform speichert. Dann mußt Du nach einmaliger Berechnung nie mehr rechnen....

vop
 
Ich versteh nur Bahnhof ;)

Hast du den Codesnipplet irgendwo rauskopiert?

Also, so sieht das bei mir aus?

PHP:
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbtable, $link);

if($txtMessage!="" && $txtNickname!=""){
	$txtMessage=format_message($txtMessage);
	$txtNickname=format_title($txtNickname);
	mysql_query("INSERT INTO $shoutbox (time, nick, txt) VALUES('".time()."', '$txtNickname', '$txtMessage')");
}

$ausgabe = mysql_query("SELECT * FROM $shoutbox ORDER BY time DESC LIMIT 8");
?>

Und dann geb ich die einfach in ner tabelle aus wie zB.:

PHP:
<table width="100%" border="0" cellspacing="0" cellpadding="0">
              <tr>
                <td width="2%">&nbsp;</td> 
                <td width="98%"> <font color="#cd3333"><b> 
                  <?=$print[nick]?>
                  </b></font><br>
                  schrieb am 
                  <? print date("d.m.", $print[time]); ?>
                  um 
                  <? print date("H:i", $print[time]); ?>
                  <br>
                  <?=$print[txt]?>
                  <br>
                  <br>
                </td>
              </tr>
            </table>

Wo bau ich dann dein Script ein?
 
sollen die gb einträge, die kleiner sind als 300 Zeichen auch in der Shoutbox stehen?
es geht doch nur um die GB Einträge oder soll an denen in der Shoutbox auch was geändert werden?
guck dir einfach mal die Funktion wordwrap() an oder mach es wie vop gesagt hat, das könntest du in einer schleife machen, die bei 300 startet und immer eins runter geht, bis $string[$i--]==" " und dann kannste an der stelle die .. reinsetzen...
du kannst ja die GB Einträge einfach so machen, dass sie mit in die Shoutbox geschrieben werden (also halt nur 300 Zeichen, wenn sie länger sind) und wenn du es dann verlinkst musst du halt anker setzen, um dann auf den bestimmten eintrag zu kommen.
oder hab ich was falsch verstanden, wie das ablaufen soll?
 
Hallo,
wenn du nur eine bestimmte Anzahl an Zeichen ausgeben willst, dann könnte dir folgendes Code Beispiel helfen:
PHP:
 <?
  $str = "Das ist der Erste Satz. Das der Zweite und zum Schluss folgt der Dritte Satz.";
  echo substr($str, 0, strpos($str, " ", 50)).'... <a href="http://www.mehr.de">mehr</a>';
  echo "<br>";
  echo substr($str, 0, strpos($str, ".", 50)+1).' <a href="http://www.mehr.de">mehr</a>';
?>

mfg
forsterm
 
forsterm: wofür steht die variable $str ? Die 50 steht für 50 Wörter? Wo bau ich das Script ein? Steh irgendwie auf dem Schlauch!

@ GuenniFD: Ja, es sollen nur die Einträge aus dem GB in der Shoutbox dargestellt werden - nicht andersrum. Bin gerade noch auf der Arbeit, werde mich, wenn ich zu Hause bin, nochmal an die Datenbankabfrage setzen. Ich muss doch nur theoretisch das gleiche machen wie bei der shoutbox: hier mein idee:

1. Verbinung mit Datenbank
2. Abfrage des Inhalts der GB-Tabelle (Name, Eintrag, Zeit)
3. Wiedergabe/Darstellung des Inhalts reduziert auf 500 Zeichen bzw 50 Wörter

Hab mich ein bisschen über den Befehl wordwrap erkundigt - blick da aber nicht wirklich durch.
 
Zuletzt bearbeitet:
sollen denn alle GB Einträge in der Shoutbox (also gekürzt) angezeigt werden? Dann kannst du doch einfach in deinem GB Skript beim schreiben in die GB Datenbank mit in die Shoutbox Datenbank schreiben, halt gekürzt auf 50 Wörter oder spricht was dagegen?
In der Variable $str steht dann der Eintrag, bei der Version von forsterm wird halt nach 50 Zeichen das nächste Leerzeichen bzw. Punkt gesucht, also ist die Zeichenkette immer mindestens 50 Zeichen lang, kann aber auch länger sein.
du musst im gb sowieso anker setzen, um auf den entsprechenden Eintrag irgedwie verlinken zu können..
im manual kannst du dir ja die benutzten funktionen angucken, das ist eigentlich gut erklärt! wordwrap() bricht den String einfach um, also da kann es dann passieren, dass ein Wort nur halb darsteht...
 
Jaja, genau! alle einträge sollen aus dem gb in der shoutbox angezeigt werden.
Also ich mach dann nach dem Absenden-Button im GB nach der Funktion

INSERT INTO $gbtabelle VALUES (name, eintrag, zeit);
INSERT INTO $shoutboxtabelle VALUES (name, eintrag, zeit);
-> hier dann, dass der eintrag gekürzt wird? wie muss ungefähr die funktion aussehen
 
bevor du in die shoutboxtabelle schreibst, kürzt du den eintrag und fügst einen link hinten dran, der auf den entsprechenden gb eintrag verweist...
wenn du es dir besonders einfach machen willst, machst du es in der Art
Code:
<?
$short_entry = substr($eintrag, 0, 50).'<a href="gb.php?entry=eintragnummer">..mehr</a>';
?>
so nimmst du die ersten 50 Zeichen, aber schöner wäre es natürlich bei einem leerzeichen..
eintragnummer muss dann die eintragnummer (id des gb datensatzes) hin, damit du ordentlich verlinken kannst..
 
Zurück