Text in 2 Teile aufteilen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
absatz
abschneiden
abstand
anzahl
blocken
code
gleiche macht
ort
output
pos
problem
punkt
satz
schleife
start
teil
text
url
zahlenwert
zeichen
-
Hallo
ich habe in einem Array Texte (String) die ca. zwischen 200 und 800 Zeichen lang sind.
Wie kann ich den Text in 2 Absätze aufzeilen, die etwa gleich gross sind
... ohne dass der Text mitten im Wort abgeschnitten wird ?
bisher habe ich es so
$dlength = strlen($data['descr']); $halblen = ceil($dlength/2); $descarr = str_split( $data['descr'], $halblen ); echo "<p> ".$descarr[0]." </p> \r\n"; // ----- Absatz 1 ----- echo "<p> ".$descarr[1]." </p> \r\n"; // ----- Absatz 2 -----
wie bekomme ich es hin,. das der Text nicht mitten in einem Wort getrennt wied?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du kannst die Länge einfach durch 2 Teilen.
Dann guckst du, ob da, wo of halber länge zufällig ein Leerzeichen ist.
Wenn ja, dann ist alles super.
Wenn nicht, dann kannst du strpos() benutzen, um das nächste Leerzeichen zu finden.
http://php.net/strpos
also sowas wie:
$splitpos = strpos($data['descr'], " ", $halblen);
Da bekommst du das erste Leerzeichen ab der Hälfte des Textes -
Danke
so habe ich es jetzt gemacht und es klappt ganz gut
$dlength = strlen($data['descr']); $halblen = ceil($dlength/2); $splitpos = strpos($data['descr'], " ", $halblen); $descparts = str_split($data['descr'], $splitpos); $desc_part1 = trim($descarr[0]); $desc_part2 = trim($descarr[1]); echo "<p> ".$desc_part1." </p> \r\n"; // ----- Absatz 1 ----- echo "<p> ".$desc_part1." </p> \r\n"; // ----- Absatz 2 -----
aber bei sehr langen Texten würde ich gerne noch mehr Absätze machen,
quasi die Anzahl der Absätze (Text-Teile) dynamisch je nach Text-Gesamt-Länge.
Ein Absatz soll dabei z.B. maximal 300 Zeichen haben
wenn also der Text 1000 Zeichen hat, dann will ich 4 Absätze bekommen
... wie gehe ich das am besten an?
Beitrag zuletzt geändert: 14.4.2012 11:20:37 von kataloge -
webaffe schrieb:
Du berechnest in welchem Abstand von Zeichen ein Absatz sein muss und veränderst dementsprechend in einer for() Schleife die Anzahl und den Ort der Absätze
Hallo
ja, habe schon mit for Schleife rumprobiert,
Problem ist,nach dem Text abschneiden bei letzes Leerzeichen in 300 Zeichen Block
muss die nächste Start-Pos um die (nach dem Leerzeichen) nicht verwendeten Zeichen
angepasst werden, also nächste Start-Pos um diese Anzahl verschieben
garnicht so einfach
und dann hab was gefunden, was das gleiche macht wie meine for Schleife sollte
wordwrap()
$partlen = 300; // --- länge Je Text-Block --- $trenner = '~'; // --- ein Trenner-Zeichen, das nicht im $text vorkommt $neuertext = wordwrap( $text, $partlen, $trenner ); $textarray = explode($trenner,$neuertext); ## echo "<pre>\n"; ## print_r($textarray); ## echo "</pre>\n"; foreach($textarray as $tpart) { echo "<p>".$tpart."</p>\n"; }
... eigentlich ganz einfach
ABER noch nicht schön .... die Absätze werden mitten im Satz umgebrochen,
lieber wäre mir Umbrauch (neuer Text-Teil) nicht bei Leerzeichen, sondern bei Satzende (. Punkt)
nur Probleme dabei sind,
was ist, wenn ein Satz länger als 300 Zeichen ist, also kein Punkt kommt ...
dann muss es halt doch das letze Leerzeichen nehmen,
und was wenn im Text ein Zahlenwert wie 12.5 steht bzw. anderer Text mit Punkt der kein Satzende ist
... evtl mit Punkt + Leerzeichen als Trenner
Beitrag zuletzt geändert: 14.4.2012 11:30:04 von kataloge -
kataloge schrieb:
webaffe schrieb:
Du berechnest in welchem Abstand von Zeichen ein Absatz sein muss und veränderst dementsprechend in einer for() Schleife die Anzahl und den Ort der Absätze
Hallo
ja, habe schon mit for Schleife rumprobiert,
Problem ist,nach dem Text abschneiden bei letzes Leerzeichen in 300 Zeichen Block
muss die nächste Start-Pos um die (nach dem Leerzeichen) nicht verwendeten Zeichen
angepasst werden, also nächste Start-Pos um diese Anzahl verschieben
garnicht so einfach
und dann hab was gefunden, was das gleiche macht wie meine for Schleife sollte
wordwrap()
$partlen = 300; // --- länge Je Text-Block --- $trenner = '~'; // --- ein Trenner-Zeichen, das nicht im $text vorkommt $neuertext = wordwrap( $text, $partlen, $trenner ); $textarray = explode($trenner,$neuertext); ## echo "<pre>\n"; ## print_r($textarray); ## echo "</pre>\n"; foreach($textarray as $tpart) { echo "<p>".$tpart."</p>\n"; }
... eigentlich ganz einfach
ABER noch nicht schön .... die Absätze werden mitten im Satz umgebrochen,
lieber wäre mir Umbrauch (neuer Text-Teil) nicht bei Leerzeichen, sondern bei Satzende (. Punkt)
nur Probleme dabei sind,
was ist, wenn ein Satz länger als 300 Zeichen ist, also kein Punkt kommt ...
dann muss es halt doch das letze Leerzeichen nehmen,
und was wenn im Text ein Zahlenwert wie 12.5 steht bzw. anderer Text mit Punkt der kein Satzende ist
... evtl mit Punkt + Leerzeichen als Trenner
Dann musst dumit einer if() {} else {} Anweisung arbeiten und das Problem mit dem 12.5 kannst du durch einen regulären Ausdruck beheben. -
Sowas in der Richtung hätte ich mir jetzt überlegt:
function splitStringByLength($inputString, $maxLength) { $i=0; $j=0; $testString = implode(" ", $inputString); foreach($testString as $currentString) { if($j - $i + count($currentString) > $maxLength) { $output[] = substr ($inputString, $i , $j-$i) $i = $j; } $j += count($currentString) + 1; } $output[] = substr ($inputString, $i , count($inputString)-$i) return $output; }
Ansonsten irgendwas mit strripos() und substr().
while($j < count($inputString)) { $j = strripos(substr($inputString, $i, 300)) + 1; $output[] = substr ($inputString, $i , $j); $i += $j; }
Kann sein, dass da die Längen noch nicht richtig hinhauen und irgendwo noch ein +1 in die Scheifen rein muss und der Reststring noch nicht ganz richtig verarbeitet wird.
//edit
Man sollte den gesamten Thread lesen, wordwrap also ... -.-
Du kannst ja eine Gewisse Intelligenz einbauen. Dann suchst du mit strripos erst nach dem letzten Punkt und entscheides dann, ob er nach Punkt oder Leerzeichen trennen soll, je nachdem wie weit die beiden auseinanderliegen. Oder du suchst schon im nächsten Teil nach dem nächsten Punkt und wenn der nur 2 Wörter später kommt trennst du lieber nach Punkt anstatt Leerzeichen. So in etwa.
//edit2
Natürlich is das erste Beispiel Käse, weil man irgendwie wieder mit Explode an den Ursprungsstring ran muss.
Beitrag zuletzt geändert: 14.4.2012 12:54:56 von travianinc -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage