PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bestimmte zeichenanzahl...


Box
03.08.2003, 18:02:25
hi,

ich möchte einen string nach einer bestimmten anzahl von zeichen abbrechen, jedoch vorher noch zum vorherigen leerzeichen zurückspringen, damit das wort (wo die zeichenlänge erreicht wird) nicht auseinandergerissen wird.

ich hatte schon eine idee, dass ich das ganze in einer schleife (z.b. for oder while) einbaue und dann immer mit strlen() ob ich schon die zeichenlänge überschritten hab oder nicht.
ein zweites problem: ich kann nicht einfach <br> benutzen, da ich den text auf einen bild, mit hilfe von imagettftext(), erstellen möchte.

wer kann mir dabei helfen?

c4
03.08.2003, 18:55:27
Ich kann Dir nur bei ersterem helfen:<?php
$str='Das ist ein längerer
Text ohne Zeilenumbrüchen, wo
sie niemand braucht und auch
wohl niemand setzen würde.';

$max_chars=100;
$words=explode(' ', $str);

$str_neu='';
for ($i=0; $i<count($words); $i++) {
if (strlen($str_neu)+strlen($words[$i])<$max_chars) {
$str_neu.=$words[$i].' ';
}
}

echo $str_neu;
?> Die Zeichenkette wird an den Leerzeichen aufgetrennt und dann in einer Schleife überprüft, ob das nächste Wort noch angehangen werden kann ohne das Maximum zu überschreiten.
Das Ding ist aber noch nicht so toll. Schließlich wird HTML nicht beachtet. Sollte da mal ein Link dazwischen sein, dann sind 100 Zeichen schnell voll.

Box
03.08.2003, 19:03:37
hmm ... ich hab mal die zeichenlänge max_chars mal auf 10 gesetzt. ausgabe: Das ist :(

c4
03.08.2003, 19:10:46
Na ist doch richtig so!
das --> 3 Zeichen
--> Leerzeichen, ein Zeichen --> 4 Zeichen
ist --> 3 Zeichen --> 7 Zeichen
--> Leerzeichen, ein Zeichen --> 8 Zeichen
ein --> 3 Zeichen --> 11 Zeichen --> größer 10, also nicht mehr dabei.

Box
03.08.2003, 19:40:26
das ist klar. meinte ja nur, dass der string nicht vollständig ausgegeben wird. muss ich wohl erst noch machen..

trozdem danke erstmal für die hilfe!

chris17
03.08.2003, 19:50:43
das ist klar. meinte ja nur, dass der string nicht vollständig ausgegeben wird.
Hi Box,

aber genau das, wolltest Du doch, oder?!?

Box
03.08.2003, 20:03:12
du hast es erfasst ;)

hatte gerade die idee bekommen in der schleife massenhaft abfragen einzubauen...

if(strlen($words[$x])<$max_chars){...}
if(strlen("$words[$x] $words[$x+1]")<$max_chars){...}
if(strlen("$words[$x] $words[$x+1] $words[$x+2]")<$max_chars){...}
...

ist aber ziemlich umständlich :(

c4
03.08.2003, 20:05:28
Ich verstehe Dein Problem nicht (mehr), Kiste. Das Skript da oben macht doch exakt das, was Du wolltest. Dachte ich. Denkt Chris.

Formuliere bitte nochmal, was Du willst und dann fangen wir einfach von vorne an.

Box
03.08.2003, 20:12:57
allllsoooo...

ich lese auf einem textfile einen string aus und möchte diesen auf einen png-bild darstellen. dieser string darf aber eine bestimmte zeilenlänge nicht übersteigen, da der text sonst neben dem bild steht. <br> kann ich dabei nicht benutzen, da sonst auf den bild nur "<br>" steht. d.h. ich muss als erstes eine algorhytmus(?) finden womit ich den string auf die richtige länge bringe und als zweites eine schleife (oder etwas anderes) was den geteilten string auf den bild ausgibt.

ist die erklärung ausreichend?

c4
03.08.2003, 20:38:10
Algorithmus (http://mr-check.xipolis.net/v2.0/Mrcheck.php?SB=algorithmus&CID=duden) ;)

Nehmen wir halt das:<?php
$str='Das ist ein Test zum testen eines
sinnlosen Testes, der ein Test für
selfPHP ist. Ist halt so ein Test.';

$str=str_replace("rn", ' ', $str);

$max_chars=20;
$words=explode(' ', $str);

$i=0;
while (true) {
if (!isset($str_neu[$i])) {
$str_neu[$i]='';
}

$j=0;
while (strpos($str, ' ', $j)<=$max_chars && $j<strlen($str)) {
$j++;
}

$str_neu[$i]=substr($str, 0, $j-1);

$str=substr($str, $j, strlen($str));

if (strlen($str)<$max_chars) {
$i++;
$str_neu[$i]=$str;
break;
}

$i++;
}

echo join("nn", $str_neu);
exit;
?>

Box
03.08.2003, 20:46:31
coole sache! DANKE!!!

jetzt muss ich nur noch count() auf str_neu anweden und damit eine schleife machen, die dann wiederrum imagettftext(), mit der entsprechender verschiebung, ausgibt.

Franzx
18.10.2006, 11:55:24
$str='Das ist ein längerer
Text ohne Zeilenumbrüchen, wo
sie niemand braucht und auch
wohl niemand setzen würde.';

$max_chars=100;
$words=explode(' ', $str);

$str_neu='';
for ($i=0; $i<count($words); $i++) {
if (strlen($str_neu)+strlen($words[$i])<$max_chars) {
$str_neu.=$words[$i].' ';
}
}


Eine Frage zu diesem Script. Wenn ich dies richtig erkenne so zählt $i die Wörter und $max_chars ist die Grenze für die einzelen Zeichen. Es funktioniert auch, ist mir bewußt,
doch wo, an welcher Stelle werden die Zeichen gezählt und mit $max_chars verglichen, damit eben bei der Grenze der "Ausstieg" statt findet??

cu,
Franzx

daFloh
18.10.2006, 13:45:23
da wos fett ist
Er zählt die vorhandenen Zeichen + die Zeichen im nächsten Wort. je nachdem ob die maximale Anzahl an Zeichen überschritten wird oder nicht wird das Wort noch an die Zeichenkette angehängt.



$str='Das ist ein längerer
Text ohne Zeilenumbrüchen, wo
sie niemand braucht und auch
wohl niemand setzen würde.';

$max_chars=100;
$words=explode(' ', $str);

$str_neu='';
for ($i=0; $i<count($words); $i++) {
if (strlen($str_neu)+strlen($words[$i])<$max_chars) {
$str_neu.=$words[$i].' ';
}
}


strlen -- Ermitteln der String-Länge
http://de3.php.net/manual/de/function.strlen.php

Franzx
18.10.2006, 14:45:00
da wos fett ist
Er zählt die vorhandenen Zeichen + die Zeichen im nächsten Wort. je nachdem ob die maximale Anzahl an Zeichen überschritten wird oder nicht wird das Wort noch an die Zeichenkette angehängt.


Jetzt ist der Groschen gefallen :-)
Damit habe ich keinen Zähler den ich an sich auswerten könnte, so wie $i=0 den ich mit $i++ hochzähle, da $strlen die gesamte Variable für sich hochzählt.

Schade ich wollte, wenn $max_chars erreicht ist, nicht nur den Text einfach abschneiden, sondern anstelle zumindest mit "... Text abgeschnitten" darauf hinweisen.
Gut, muss ich mir was anderes einfallen lassen.

Vielen Dank!

cu,
Franzx

daFloh
18.10.2006, 15:26:54
Schade ich wollte, wenn $max_chars erreicht ist, nicht nur den Text einfach abschneiden, sondern anstelle zumindest mit "... Text abgeschnitten" darauf hinweisen.
Gut, muss ich mir was anderes einfallen lassen.


Kannst Du doch

$str='Das ist ein längerer
Text ohne Zeilenumbrüchen, wo
sie niemand braucht und auch
wohl niemand setzen würde.';

$max_chars=100;
$words=explode(' ', $str);

$str_neu='';
for ($i=0; $i<count($words); $i++) {
if (strlen($str_neu)+strlen($words[$i])<$max_chars) {
$str_neu.=$words[$i].' ';
}
else{
$str_neu.="...";
}
}

Franzx
19.10.2006, 08:35:30
Leider nicht.
Mit Deiner vorgeschlagenen Lösung macht er für jedes Wort, was sich nicht mehr innerhalb von $max_chars befindet, diese Punkte.
Diese werden zwar ans Ende gesetzt, doch bei zehn Worten sind das nicht nur 3 Punkte, sondern 30 Punkte.

Der Aufbau meines Quelltextes ist wie folgt:

$result = mysql_query("SELECT ... ");
while($row = mysql_fetch_array($result))
{
$max_chars=100;
$words=explode(' ', $row['text']);

$str_neu='';
for ($i=0; $i<count($words); $i++) {
if (strlen($str_neu)+strlen($words[$i])<$max_chars) {
$str_neu.=$words[$i].' ';
}
else{
$str_neu.=' ...';
}
}
Ausgabe der Daten
}

daFloh
19.10.2006, 09:21:17
Sorry,

Naja ganz dreißig Punkte werden es wohl nicht gewesen sein...


$result = mysql_query("SELECT ... ");
while($row = mysql_fetch_array($result))
{
$max_chars=100;
$words=explode(' ', $row['text']);

$str_neu='';
for ($i=0; $i<count($words); $i++) {
if (strlen($str_neu)+strlen($words[$i])<$max_chars) {
$str_neu.=$words[$i].' ';
}
else{
$str_neu.=' ...';
break; // Noch hinzufügen
}
}
Ausgabe der Daten
}

Franzx
19.10.2006, 09:37:04
Sorry,

Naja ganz dreißig Punkte werden es wohl nicht gewesen sein...


Tatsächlich ist es so, dass das entsprechende Feld des DS mit < 200 Zeichen auskommt. Allerdings gibt es ab und an Sonderfälle in denen es auch 2000 Zeichen sein könnten und deshalb diese Eingrenzung, die allerdings nur bei der Druckausgabe angewendet wird.

Super, so funzt es!

Nochmal vielen Dank, so ist mein Tag schon wieder gerettet.

Muss gleich mal eben noch nachsehen wo der Unterschied zwischen break und exit liegt. Hatte den Ausstieg nämlich mit exit versucht.

cu,
Franzx

daFloh
19.10.2006, 09:53:43
exit beendet die komplette wietere Scriptausführung *denkz*
break unterbricht einfach nur die übergeordnete Schleife und setzt den Code am Schleifenende fort.

Franzx
19.10.2006, 10:01:45
exit beendet die komplette wietere Scriptausführung *denkz*
break unterbricht einfach nur die übergeordnete Schleife und setzt den Code am Schleifenende fort.

Ja, habe ich eben hier in der Befehlsreferenz nachgelesen. break ist sogar wichtig in den for, while, switch Schleifen, da es ohne sonst zu Endlosschleifen kommen könnte.