Jeśli zależy Ci na podzieleniu tekstu na fragmenty, a podział ma być przeprowadzany zgodnie z podziałem na akapity to problem jest sądze niewielki. Ja bym to zrobił w ten sposób:
Kod
<?php
$text='Młoda, ciemnowłosa, starannie umalowana dziewczyna w stroju wieczorowym jedzie elegancką limuzyną. Limuzyna zatrzymuje się na poboczu. Nie taki był jednak cel podróży, dziewczyna, zaniepokojona, protestuje. Kierowca mierzy do niej z pistoletu i każe jej wysiadać. W tym momencie w limuzynę uderza samochód pełen rozbawionych młodych ludzi.<BR>Dziewczynie udaje się wyjść cało z wypadku. Słaniając się na nogach idzie przed siebie, schodząc w dół na Sunset Blv. Zasypia w krzakach. Jest wyraźnie zdenerwowana, zdezorientowana i zagubiona. Budzą ją głosy. Starsza zadbana kobieta o pysznych rudych włosach dyryguje szoferem znoszącym bagaże do samochodu. Korzystając z chwili nieuwagi właścicielki, dziewczyna wślizguje się do domu, gdzie kuli się na podłodze po stołem.<BR>Dwaj mężczyźni rozmawiają w barze. Jeden jest młodszy, przejęty i nerwowy, drugi starszy i trzymający trochę dystans. Młodszy opowiada mu o swoim śnie, w którym obaj się znajdują - miejsce jest to samo, bar Winkiego, a atmosfera jest przepełniona irracjonalnym, niesamowitym strachem. "Nagle" opowiada chłopak "zdaję sobie sprawę co jest przyczyną tego strachu". Na zapleczu baru jest jakiś mężczyzna. Ma straszną twarz - twarz taką, że chciałoby się już nigdy więcej nie oglądać. Ale przecież to tylko sen - wystarczy pójść na zaplecze i przekonać się na własne oczy że niczego tam nie ma. Tak też robią. I rzeczywiście zza węgła wyłania się o obszarpany człowiek o strasznej twarzy, ni to indiańskiego szamana, ni to demona...ten, który to wyśnił, krzyczy i mdleje.<BR>Lotnisko. Słodka blondynka, z gatunku takich, co to zawsze zostają gwiazdami szkoły i umawiają się z kapitanem drużyny footballowej, żegna się na lotnisku z towarzyszami podróży - parą miłych staruszków. Życzą jej szczęście w tym mieście snów, żeby jej marzenie o byciu gwiazdą - a przynajmniej dobrą aktorką - się spełniło. Jak za dotknięciem czarodziejskiej różdżki zjawia się taksówkarz, zanosi jej bagaże do samochodu, po prostu - wielki świat!<BR>My zaś widzimy parę staruszków w taksówce. Śmieją się do rozpuku, wyglądają jak ludzie, którym się udał świetny kawał. Śmieją się...ale z kogo? Z Betty - tak ma na imię jasnowłosa dziewczyna - czy może... z nas?';
function split_to_paragraphs($text='', $regexp='/<br>/i')
/*
** Funkcja zwraca tekst podzielony na paragrafy, opisany
** dodatkowo pozycją w tekście i długością paragrafu.
** Zwracana tablica ma postać:
**
** Array
** (
** [0] => Array
** (
** [content] => treść akapitu pierwszego
** [offset] => pozycja akapitu
** [length] => długość akapitu
** )
**
** [1] => Array
** (
** [content] => treść akapitu drugiego
** [offset] => pozycja akapitu
** [length] => długość akapitu
** )
** itd.
** )
**
** Drugi parametr może posłużyć do podzielenia paragrafu
** według innych kryteriów niż znacznik <BR>
*/
{
function describe_array($element)
//podfunkcja opisująca paragraf
{
$element_length=strlen($element);
$element=array('content' => $element, 'offset' =>$GLOBALS['offset'], 'length' => $element_length);
$GLOBALS['offset']+=$element_length;
return $element;
}
$GLOBALS['offset']=0;
return array_map('describe_array',preg_split($regexp, $text));
};
function group_paragraphs($paragraphs, $packet_size, $packet_type='GP_BY_SIZE')
/*
** Funkcja grupuje paragrafy w pakiety wielkości $packet_size.
** Każdy pakiet zawiera co najmniej jeden paragraf. Jeśli wielkość
** pakietu przekroczy dopuszczalny rozmiar, następny paragraf
** zostanie przydzielony do kolejnego pakietu.
** Trzeci parametr określa kryterium grupowania. Mogą być to:
** GP_BY_SIZE - według długości pakietu w znakach
** (np. pakiet wielkości 1000 znaków)
** GP_BY_AMOUNT - według ilości paragrafów w pakiecie
** (np. nie więcej niż 3 paragrafy w pakiecie)
** Tablica pakietów zwracana przez funkcję posiada następujące klucze:
** 'content' => tablica zawierająca paragrafy danego pakietu
** 'length' => łączna długość paragrafu w znakach
** 'offset' => pozycja początku pakietu
** 'amount' => liczba paragrafów w pakiecie
*/
{
if (is_array($paragraphs))
{
$local_size=$amount=$length=$offset=0;
foreach ($paragraphs as $para)
{
$amount++;
$length+=$para['length'];
if ($packet_type=='GP_BY_AMOUNT')
{$local_size=$amount;}
else
{$local_size=$length;};
$packet_content[]=$para;
if ($local_size>=$packet_size)
{
$packet['content']=$packet_content;
$packet['length']=$length;
$packet['offset']=$packet_content[0]['offset'];
$packet['amount']=$amount;
$packets[]=$packet;
$local_size=$amount=$length=$offset=0;
$packet_content=array();
};
};
//wrzucenie ewentualnych resztek do ostatniego pakietu:
if (!empty($packet_content))
{
$packet['content']=$packet_content;
$packet['length']=$length;
$packet['offset']=$packet_content[0]['offset'];
$packet['amount']=$amount;
$packets[]=$packet;
};
return $packets;
} else return NULL;
}
//dzielimy sobie tekst na paragrafy:
$paragraphs=split_to_paragraphs($text);
//grupujemy paragrafy po 2 na stronę
$pages_by_amount=group_paragraphs($paragraphs, 2, 'GP_BY_AMOUNT');
//albo po przynajmniej 500 znaków na stronę
$pages_by_length=group_paragraphs($paragraphs, 500);
//cztery linijki poniżej wyświetlają wyniki kolejnych kroków
//print($text);
//print('<HR><PRE>'); print_r($paragraphs); print('</PRE>');
//print('<HR><PRE>'); print_r($pages_by_amount); print('</PRE>');
//print('<HR><PRE>'); print_r($pages_by_length); print('</PRE>');
?>
Funkcję do wyświetlania kolejnych stron zostawiam Twojej inwencji.

Mając gotową tablicę nie powinieneś mieć z tym problemu. Jeśli trzebaby pociąć akapity w połowie ich długości to wystarczy odpowiednio zmodyfikować funkcję
split_to_paragraphs. Z resztą Seth już napisał Ci jak można to zrobić. 8)