Homepage selbermachen 7.852 Themen, 35.619 Beiträge

Zeilenumbruch bei php für Gästebuch

Meriadoc23 / 28 Antworten / Baumansicht Nickles
Hoi,

ich schreibe ein GB das ist auch soweit fertig, ich hab im Hintergund Bilder die den Text umrahmen wenn jemand jetzt etwas schreibt ohne einen Zeilenumbruch mit RETURN zu machen, dann wird der text über den Rand hinausgeschrieben und die Bilder wiederholen sich demnach .. das sieht scheiße aus !

Wie macht man es besser bzw so das bei 60 Ziffern automatisch ein RETURN gesetzt wird ?
bei Antwort benachrichtigen
Meriadoc23 Nachtrag zu: „Zeilenumbruch bei php für Gästebuch“
Optionen

schauts euch auf http://mitglied.lycos.de/Meriadoc23/gb.php

einfach mal an

bei Antwort benachrichtigen
xafford Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

am einfachsten ist es, wenn du einfach das ganze in eine tabelle mit fester breite setzen lässt oder die textbreite und ausrichtung mit
css formatierst.
ansonsten, wenn es unbedingt php sein soll, dann kannst du mit
strlen() die zeichenanzahl deines textes überprüfen und entsprechend
eine funktion bauen, die nach jeweils 60 zeichen einen \r\n einbaut.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
xafford Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

ist übrigens das falsche board, ich verschiebe es auf html.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Zaphod Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

... mh, ich ersetze einfach die Zeilenumbrüche im Texfeld bei der Ausgabe durch <br>-Tags, in $text steht der Datenbankeintrag:


... das zusammen mit xaffords Vorschlag sollte alle Probleme erschlagen ;-)
bei Antwort benachrichtigen
xafford Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

mir ist noch was eingefallen:
definiere in deiner textarea einmal wrap="hard" und einmal wrap="physical". dann werden an den zeilenenden bei netscape und ie zeilenumbrüche mit übertragen.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Schnurbart Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

$stringcount = strlen($text);

Das ist ja korrekt, aber Wie genau breche ich dann nun nach zum beispiel der 30. zeile um? die funktion die du angegeben hast, ermittelt lediglich die stringlänge, das ist aber nur die halbe miete, sorry, ich versteh nicht, wie man das gewünschte ergebnis erzielen könnte :((

bei Antwort benachrichtigen
xafford Schnurbart „@ Xafford“
Optionen

relativ einfach:


  • du ermitelst mit strlen die gesamtlänge des string

  • ist sie länger als eine zeile, gehst du in eine unterfunktion

  • ist sie kürzer bist du fertig und gibst den string aus


jetzt die unterfunktion:

  • du gehst an das zeichen an position 60, ist es ein leerzeichen so extrahierst du bis dahin

  • dann gibst du die extrahierte zeile in ein array, verkürzt den urstring um diese zeile und gibst den urstring an die obere abfrage zurück

  • ist zeichen 60 kein leerzeichen, so gehst du ein zeichen zurück

  • ist das jetztige zeichen ein leerzeichen, gehst du nach oben zurück, wenn nein, dann nächste iteration

so läufst du den gesamten string durch.
alles was du schreiben mußt ist entweder eine klasse mit 2 methoden, oder zwei funktionen, eine davon rekursiv.
Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Schnurbart Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

Danke für deine Ausführung. Kannst du mir vielleicht noch ein praktisches Beispiel geben? Ein bissl code zum anschauen wäre nicht übel :-D

bei Antwort benachrichtigen
xafford Schnurbart „@Xaff“
Optionen

ein bißchen? du wagst zu scherzen ;o)...
wenn ich mal ganz viel zeit und lust hab,
dann scho, ansonsten verdien ich lieber brötchen ;o)...

nee im ernst, so schnell aus dem ärmel schüttel ich
das auch net und im moment bin ich so eingespannt,
daß ich mich net mal schnell ne halbe stunde hinsetzen
kann um sowas just fpr fun zu basteln....vielleicht
hab ich ja mal ende der woche luft...

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Schnurbart Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

Schade, ich hätte mich auch erkenntlich gezeigt *zwinker* und dir einen geschrubbt. Aber wenn du zeit hättest, wäre ich dir dankbar :-)

bei Antwort benachrichtigen
Meriadoc23 Nachtrag zu: „Zeilenumbruch bei php für Gästebuch“
Optionen

Ähmm ja nur um das nochmal festzuhalten, ich hab den Thread erstellt aber ich bin nicht Xaffi ... nicht das hier jemand denkt ich wäre so aufdringlich :p

Also nochmaals viiiiielen Dank, ich werde anhand der Hilfen hinbekommen.

bei Antwort benachrichtigen
Schnurbart Meriadoc23 „Ähmm ja nur um das nochmal festzuhalten, ich hab den Thread erstellt aber ich...“
Optionen

ach ja? dann kannst du vielleicht ein beispiel posten? wäre echt nett

bei Antwort benachrichtigen
Borlander Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

Hab da mal ne Funktion für geschrieben:

function str_break($str, $maxlen)
{
  $nobr = 0;
  for ($i = 0; $i   {
    // Überprüfen ob ein das Zeichen ein möglicher Zeilenubruch ist
    if (($str[$i]!=' ') && ($str[$i]!='-') && ($str[$i]!="\n"))
      $nobr++;
    else
      $nobr = 0; // Zeichen ist Trennzeichen - Zähler zurücksetzen

    // Wenn die Zeichenkette ohne Trennzeichen länger als zulässig ist
    // wird ein Trennzeichen eingefügt und der Zähler zurückgesetzt
    if ($nobr>$maxlen)
    {
      $nobr = 0;
      $str_br .= '-'.$str[$i];
    }
    else
      $str_br .= $str[$i];
  }
  $str_br .= substr($str, -$maxlen);
  return $str_br;
}


Wenn der Sting $str einen Substing der Länge $maxlen+1 enthält, der kein " ", "-" oder Zeilenunbruch enthält, wird ein "-" eingefügt, so dass der Browser automatisch umbrechen kann.

@Xafford:
Ich behaupte einfach mal ganz frech das mein Algorithmus besser ist, weil der String nur einmal durchlaufen wird.


CU Borlander
bei Antwort benachrichtigen
xafford Borlander „Funktion: Zeilenumbruch“
Optionen

ok, einfacher ist er auf jeden fall, ob er aber schneler ist? ;o)
immerhin klappert er jedes zeichen ab :o)...

*just kiddin*...
nee im ernst...gute lösung.

ps: aber bin ich blind, oder hast du da syntaxfehler drin?
for schleife wscheint mir die bedingung irgendwie nicht ganz korrekt, wurde wohl das < als tag angesehen.
außerdem hat die funktion einen kleinen schönheitsfehler, wenn ich nicht schon zu müde bin um sie zu kapieren, sie ist nicht iterativ, das heißt, die erzeugt nur einen umbruch, man muß sie also für jede zeile des gesamten textes neu durchlaufen lassen.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Borlander xafford „Funktion: Zeilenumbruch“
Optionen
for schleife wscheint mir die bedingung irgendwie nicht ganz korrekt, wurde wohl das
Stimmt werde ich gleich nochmal in korrekter Form posten.

sie ist nicht iterativ, das heißt, die erzeugt nur einen umbruch, man muß sie also für jede zeile des gesamten textes neu durchlaufen lassen.
Eigentlich nicht, es wird der ganze Text verarbeitet inclusive Zeilenumbrüchen. Je nach Text und gewählter Maximallänge erzeugt das Programm eine ganze Reihen von möglichen Zeilenubrüchen in Form von "-". Ob an der Stelle umgbrochen werden muss, kann der Browser dann selbst entscheiden. Einen erzwungennen Textumbruch halte ich bei nicht fester Zeichenbreite für nicht so sinnvoll.


CU Borlander


PS: kleiner Fehler ist allerdings trotzdem noch drin, allerdings Inhaltlicher natur. Die Unumgebrochene Zeichenkette am Ende bis zu 2 * $maxlen - 1 Zeichen lang sein.
bei Antwort benachrichtigen
Borlander Nachtrag zu: „Funktion: Zeilenumbruch“
Optionen

Hier noch mal der korrigierte Code:

function str_break($str, $maxlen)
{
  $nobr = 0;
  $len = strlen($str);
  for ($i = 0; $i<$len; $i++)
  {
    // Überprüfen ob ein das Zeichen ein möglicher Zeilenubruch ist
    if (($str[$i]!=' ') && ($str[$i]!='-') && ($str[$i]!="\n"))
      $nobr++;
    else
    {
      $nobr = 0; // Zeichen ist Trennzeichen - Zähler zurücksetzen
      if($maxlen+$i>$len)
      {
        // Ist der Rest kürzer als $maxlen, muss er nicht mehr überprüft werden
        $str_br .= substr($str, $i);
        break;
      }
    }
    // Wenn die Zeichenkette ohne Trennzeichen länger als zulässig ist
    // wird ein Trennzeichen eingefügt und der Zähler zurückgesetzt
    if ($nobr>$maxlen)
    {
      $str_br .= '-'.$str[$i];
      $nobr = 1;
    }
    else
      $str_br .= $str[$i];
  }
  return $str_br;
}



Borlander
bei Antwort benachrichtigen
Meriadoc23 Nachtrag zu: „Zeilenumbruch bei php für Gästebuch“
Optionen

Ich habs hinbekommen mit der Lösung (A) .. danke nochmal.

bei Antwort benachrichtigen
Meriadoc23 Nachtrag zu: „Zeilenumbruch bei php für Gästebuch“
Optionen

Ach ist das stressig, jetzt verstehe ich auch die Problematik mit dem Leerzeichen .. hmm hmm ... hmm ... er trennt bei mir automatisch ganz Wörter .. garnicht schön.. ajo dann versuch ich mal Variante b :P

bei Antwort benachrichtigen
Meriadoc23 Nachtrag zu: „Zeilenumbruch bei php für Gästebuch“
Optionen

Oki ich habs jetzt es ist nicht perfekt ... aber für meine Zwecke reichts, ich gehe einfach mal davon aus, wenn Jemand einen Umbruch in dem Text schreibt, dann macht er das auch für den restlichen Text...

Schlagt die Hände überm Kopf zusammen und lacht mich aus !!! Ich poste das jetzt mal.

$leng = 53;
$leng1 = $leng*2;
$leng2 = $leng*3;
$leng3 = $leng*4;

$size = strlen($text);

if (strstr($text, "[br]"))
{
$eintrag = $text;
}
else
{

if ($size else
{
if ($size > $leng) {
$t1 = substr($text,0,$leng);
$t2 = substr($text,$leng);
$eintrag = "$t1[br]$t2";
}
if ($size > $leng1) {
$t1 = substr($text,0,$leng);
$t2 = substr($text,$leng,$leng);
$t3 = substr($text,$leng1);
$eintrag = "$t1[br]$t2[br]$t3";
}

if ($size > $leng2) {
$t1 = substr($text,0,$leng);
$t2 = substr($text,$leng,$leng);
$t3 = substr($text,$leng1,$leng);
$t4 = substr($text,$leng2);
$eintrag = "$t1[br]$t2[br]$t3[br]$t4";
}

//usw usw .. ne Funktion wäre net schlecht :D
}
}
}

bei Antwort benachrichtigen
xafford Meriadoc23 „Oki ich habs jetzt es ist nicht perfekt ... aber für meine Zwecke reichts, ich...“
Optionen

so, heute hatte ich 30 minuten langeweile und hier kommt meine lösung ;o)


function fstring($str,$lim)
{
$z="";
$a=explode("\r\n",$str);
foreach($a as $b)
{
while(strlen($b)>$lim)
{
$c=$lim;
for($i=0;$i {
$c=$c-bcpow(-1,$i)*$i;
if($b[$c]==" ")
{
$z.=substr($b,0,$c)."\r\n";
$b=substr($b,$c);
break;
}
}
}
$z.="$b\r\n";
}
return $z;
}


du mußt nur noch das ganze aufrufen und formatiert ausgeben, ungefähr so:
fstring($string);
echo nl2br(fstring($string));

aber an deiner stelle würde ich einfach die textarea mit wrap="hard" und wrap="physical" definieren, dann hast du das ganze schon vom client in der entsprechenden form geliefert.

[Diese Nachricht wurde nachträglich bearbeitet.]

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Borlander xafford „so, heute hatte ich 30 minuten langeweile und hier kommt meine lösung o...“
Optionen

Hi Xafford,
bin gemein und will jetzt genau wissen welche von unseren Funktionen besser/schneller ist:

explode("\r\n",$str);
Müsste diese Funktion nicht eigentlich auch die gesamte Zeichenkette einmal durchlaufen?

substr
Wie läuft diese Funktion eigentlich intern? Speicherbereich kopieren oder die Zeichenkette durchlaufen?


CU Borlander

bei Antwort benachrichtigen
xafford Borlander „Hi Xafford, bin gemein und will jetzt genau wissen welche von unseren Funktionen...“
Optionen

hallo bor, hier ne kurze erläuterung, nachdem ich den quelltext ja nicht kommentiert habe:

explode durchläuft den ganzen string mit dem hintergrund, daß der user teilweise ja schon umbrüche gesetzt haben könnte zwecks formatierung, diese sollen natürlich erhalten bleiben und es sol nicht passieren, daß das script eventuell kurz nach oder vor einem bereits gesetzten umbruch noch einmal umbricht und ein einzelenes wort auf einer zeile stehen bleibt.
mit explode wird also der gesamte text in die einzelnen vorformatierten absätze aufgebrochen und diese werden dann einzeln durchlaufen um sie wieder umzubrechen. ich bin dan allerdings so vorgegangen, daß nicht bei der festen breite umgebrochen wird, sondern das script sucht von $limit aus das nächstgelegene leerzeichen abwechselnd vor oder nach maxleng. es wird also nicht der gesamte string durchlaufen. man könnte natürlich auch umstellen, daß es nur von $limit aus zurück sucht, so daß maxlength eingehalten wird.
was dein einwand mit ewig langen zeilen angeht, so stimmt das schon, aber es solte ja nur ein proof of concept werden, kein script für den produktiveinsatz. man könnte aber für diesen zweck noch eine weitere bedingung einbauen die überprüft, ob kein leerzeichen vorhanden ist und dann zwangsumbrechen.
was substr angeht so funktioniert das meines wissen so:
es wird ein weiterer pointer auf einen pointer to char an position 1 gesetzt und ab diesem punkt der bereich mit länge 2 in einen neuen speicherbereich kopiert. es sollte also nicht die gesamte kette durchlaufen werden, sondern nur ab dem offset kopiert werden, alles andere würde rein technisch keinen sinn machen, und da php hauptsächlich in c++ erstellt wurde, denke ich auch mal, daß es dahingehend funktioniert.

@schnur...
das script wurde von mir auf 2 servern getestet und es läuft ohne probleme, und mein warning level steht zu entwicklungszwecken immer auf E_ALL. außerdem, was soll der spruch, daß man keinem einen gefallen tut nur codefetzen hier einzustellen? erstens ist es kein codefetzen, sondern eine komplett funktionsfähige fuktion, und zweitens sind wir hier ien hilfeforum und kein dienstleister. wenn du mich bezahlst, dann bekommst du komplett dokumentierte, fertige anwendungen. so lange ich hier umsonst sachen abliefere mußt du eben nehmen, was du bekommst, oder es lassen.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
Borlander xafford „hallo bor, hier ne kurze erläuterung, nachdem ich den quelltext ja nicht...“
Optionen

Hallo Xaf,
erst mal danke für die recht ausführliche Erläuterung zu Deiner Funktion. Die Idee den String ab der maximal ungetreennten Länge aus rückwärts zu durchlaufen, ist gerade bei Normalen Text eine sehr effektive Methode. :-)

substr
Hatte schon vermutet, das das in diesere Richtung läuft.

explode
Was mich an der Verwendung von Explode störte war, das hierfür auf jeden Fall der Sting komplett durchlaufen werden muss. Wobei das vermutlich scheller läuft weil die Funktion wie der Rest von PHP in C geschrieben worden sein dürfe. Das müsste schneller sein als Laufzeitinterpretierter PHP Quelltext.


CU Borlander

bei Antwort benachrichtigen
Meriadoc23 Nachtrag zu: „Zeilenumbruch bei php für Gästebuch“
Optionen

ich hab den Zeilenumbruch schon mal auf physisch, virtuell umgestellt gehabt bevor diesem Thread hier.. aber das hat garnix gebracht, wenn Jemand z.B. das hier schreiben würde 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 dann sähe das ganz schön blöd aus :p

Ja normalsterbliche machen sowas nicht, aber es ist eine Counterstrike Seite und da sind schon ein paar hohle Früchte dabei :D

bei Antwort benachrichtigen
Borlander Meriadoc23 „ich hab den Zeilenumbruch schon mal auf physisch, virtuell umgestellt gehabt...“
Optionen

Welches der Scripte hast Du denn schon getestet?
Mein korrigiertes müsste auf jeden Fall funktionieren, habs selbst ausprobiert. Bei Xafford gehe ebenfalls davon aus das er es getestet hat, allerdings liefert sein Script ein etwas anderes Ergebnis als meins.

CU Borlander

bei Antwort benachrichtigen
Schnurbart Meriadoc23 „Zeilenumbruch bei php für Gästebuch“
Optionen

Bei mir funktioniert keines sorry, eure Kuns in Ehren aber da kommen haufen weise fehler bei mir

bei Antwort benachrichtigen
Zaphod Schnurbart „Bei mir funktioniert keines sorry, eure Kuns in Ehren aber da kommen haufen...“
Optionen

... vielleicht befasst du dich erstmal mit den Grundlagen von php - einfach copy & paste klappt da nicht ...
Du hast - wie ich aus deinen Fragen entnehme - jetzt genau drei Möglichkeiten:
1. Du lässt die Finger von php (wäre schade).
2. Du engagierst einen Profi (kostet einiges).
3. Du lernst php richtig (kostet dich eine Internetrecherche, ein paar Downloads, eventuell ein oder zwei Bücher und einige Wochen deiner Freizeit).
Entscheide dich für eine dieser Möglichkeiten - solltest du 3. wählen, helfen wir gerne weiter.
Übrigens sagen dir die Fehlermeldungen ziemlich genau, was wo nicht stimmt. Einfach mal nachverfolgen, versuchen, zu verstehen, und die Befehlsreferenz gehört auf den Schreibtisch oder in ein Browserfenster ;-)

bei Antwort benachrichtigen
Schnurbart Zaphod „... vielleicht befasst du dich erstmal mit den Grundlagen von php - einfach copy...“
Optionen

eigentlich antworte ich auf sowas dummes nicht, aber in diesem falle mach ich eine ausnahme:

ich habe mich bereits damit beschäftigt, aber ihr tut keinem user hier einen gefallen, wenn hier in den postings überall nur brocken an codes stehen. ich habe übrigens copy und paste angewandt, was ich bekomme sind errors in meinem apache. das liegt dann wohl kaum an mir

bei Antwort benachrichtigen