Schwierigere PHP-Frage zum Stringteilen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
CorniI
Mitglied
Beiträge: 42
Registriert: 19.05.2006 11:11
Wohnort: Heilbronn

Schwierigere PHP-Frage zum Stringteilen

Beitrag von CorniI »

Hi
nachdem ich auf einen Thread gestoßen bin, indem manche sich über die Einfachheit der hier gestellten Fragen beschwerten, dann habe ich hier was schweres für alle :D Sprache ist PHP 5.04
Umgebung: Joomla CMS
Problembeschreibung:
Ich habe teilweise sehr lange Texte, die mir das Joomla ausgeben soll. Ich fände es viel schöner, wenn automatisch nach x Zeichen ein Seitenumbruch eingebaut wird. Seitenumbrüche werden von Joomla unterstützt. Dabei wird der Text in $text abgelegt und mit idesem Code zerlegt:

Code: Alles auswählen

 	$regex = '/{(mospagebreak)\s*(.*?)}/i';
	$text = preg_split( $regex, $row->text );
Dies setzt jedoch voraus, das man eben {mospagebrek} auf jeder Contentseite an der gewünschten stelle einfügt was bei knapp 500 Seiten jedoch Sisyphos-Arbeit wäre.
Ansatz: da preg_split ein array zurückgibt, könnte man statt der obigen Zeile auch selber Code einfügen, der bei folgenden Bedingungen eine weitere Array-Seite liefert:
1. nach X(+n)-Zeichen
2. nach der Zeichenfolge ".<br />"
Die Zeichenfolge 2. muss natürlich erhalten bleiben, es wäre ja sinnlos, Punkte aus einem längeren Text teilweise zu entfernen, ebenso wie den Zeilenumbruch. Kann mir da jemand helfen? Bitte 8)
MfG
Corni
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Also ich würde da so vorgehen: Vom x. Zeichen jeweils nach vorn und hinten nach ".<br/>" suchen, und an der Stelle, die dichter dran ist, aufteilen. Also etwa so:

Code: Alles auswählen

$text = ...;
$separator = '.<br/>';
$zeichen_pro_seite = 100;
$seiten = array();
while(true) {
  $vor = strrpos($text, $separator, $zeichen_pro_seite);
  $hinter = strpos($text, $separator, $zeichen_pro_seite);
  if($vor === false && $hinter === false) {
    //Kein $separator (mehr) im Text
    $seiten[] = $text;
    break;
  }

  $vordiff = ($zeichen_pro_seite - $vor);
  $hinterdiff = ($zeichen_pro_seite - $hinter);
  if($vordiff < $hinterdiff) {
    //kürzeren Text als $zeichen_pro_seite nehmen
    $seiten[] = substr($text, 0, $vor);
    $text = substr($text, $vor);
  }
  else {
    //längeren Text als $zeichen_pro_seite nehmen
    $seiten[] = substr($text, 0, $hinter);
    $text = substr($text, $hinter);
  }
}
KB:knigge
Antworten

Zurück zu „Coding & Technik“