Разбиение html-документа на массив

Flash

Новичок
Есть огромная статья в html, в ней нет картинок, таблиц. Просто текст с div, h1-h5 и т.д.
Нужно сделать постраничный вывод пользователю.

Делаю так, работает:

PHP:
$text = wordwrap($text, 10000, "\n{pagebreak}\n", 1);
$text = explode("{pagebreak}", $text);
Но проблема в том что wordwrap, делит текст до ближайшего пробела, а мне надо чтоб делил до ближайшего <br> И желательно не считать символы внутри тегов. Помогите составить регулярное выражение
 

Alien85

I like my cat
PHP:
// Предварительно статья должна быть приведена к XHTML!!!
// И открытых тегов через всю статью быть не должно!
// если статья в кодировке UTF-8 замени strlen($text) на mb_strlen($text, 'UTF-8')

$maxchars = 10000;
$temp = false;
$array = array('');
$list = explode('<br>', $text);
$reg1 = '#<[^>]*[^/]\s*>#si'; // добавь `u` если UTF-8 => siu
$reg2 = '#<\s*\/\s*[^>]*>#si'; // добавь `u` если UTF-8 => siu

foreach ( $list as $v ) {
	$cursor = count($array)-1;
	$ccur = strlen( $array[ $cursor ] );
	$cmax = $ccur + strlen($v);
	
	// Считаем количество открытых и закрытых тегов
	preg_match_all($reg1, $temp . $v, $m1, PREG_SET_ORDER);
	preg_match_all($reg2, $temp . $v, $m2, PREG_SET_ORDER);
	
	if ( count( $m1 ) != count( $m2 ) )
		$temp .= $v; // Закрывающего тега нет
	else
		$temp = false;
	
	if ( $ccur == 0 OR $cmax <= $maxchars OR $temp != false )
		$array[ $cursor ] .= $v;
	else
		$array[] = $v;
}

// Всё! В массиве $array все странички разбиты примерно по 10000 символов.
// Количество страниц: count( $array )
// Регулярку не проверял, но смысл думаю ты понял.
обработка для больших документов будет долгая, но это первое, что пришло на ум.
 

Flash

Новичок
Документы большие кодировка UTF-8 и обработка на лету клиенту происходит, вот как сделал без учёта тегов

preg_match_all('~.{1,10000}(<br>|$)~si', $text, $output);

Пока даже не знаю, что делать когда пользователь заходит в статью она разбивается и в мемкэш записывается (2-3 сек в зависимости от размера пользователь получает первую страницу) и в течении часа пользователи могут читать и листать всё лётает (0,01 секунды генерируется),
вот думаю 2-3 секунды долго ли для клиента, и проект будет под большой нагрузкой как это отразится не знаю.
 

Alien85

I like my cat
2-3 сек. это смерть...

под большой это какой? 100, 1000, 10000, 100000?

с нагрузки и надо было начинать, все эти варианты не прокатят.
 

Alien85

I like my cat
попробуй мой код, убрав регулярки: получится то же что и ты написал, только куда быстрее

PHP:
$maxchars = 10000;
$array = array('');
$list = explode('<br>', $text);

foreach ( $list as $v ) {
    $cursor = count($array)-1;
    $ccur = mb_strlen($array[ $cursor ], 'UTF-8');
    $cmax = $ccur + mb_strlen($v, 'UTF-8');
    
    if ( $ccur == 0 OR $cmax <= $maxchars )
        $array[ $cursor ] .= $v;
    else
        $array[] = $v;
}
 
Сверху