Разбить текст с тегами на части, с учетом тегов.

Agent

Новичок
Приветствую многоуважаемые форумчане, появилась задачка, которую я не могу решить.

Есть текст с html-тегами, надо разбить текст на подтексты, допустим, первая часть N символов, вторая часть все остальное. Ессно с сохранением тегов (теги простые без таблиц и т.д.) т.е. если разделение попадает на тег, то надо надо сместить один из кусков в ту или иную сторону.

Пример:
| - разделитель
слово слово <b>сло|во слово</b> слово слово =>
1. слово слово
2. <b>слово слово</b> слово слово
или
слово слово <|b>слово слово</b> слово слово =>
1. слово слово
2. <b>слово слово</b> слово слово
Что-то типа такого, если без тегов, задачка решается элементарно, а вот как учесть теги?
 

WBS

Новичок
PHP:
$text = "слово слово <b>слово слово</b> слово слово";
$n = 15;			// максимальная длина каждой части текста, но не менее 1 слова

// разбиваем текст на "слова" по пробельным символам
preg_match_all("/[^\s]+/i", $text, $matches);
$text_arr = $matches[0];

// объединяем те "слова", которые содержатся внутри тегов
$text_arr2 = array();
$text_tmp = array();
$tag_open = $tag_close = 0;
foreach ($text_arr as $word) {
	$tag_open += preg_match_all("/<[^\/]+>/Ui", $word, $matches);
	$tag_close += preg_match_all("/<\/.+>/Ui", $word, $matches);
	$text_tmp[] = $word;
	if ($tag_open==$tag_close) {
		$text_arr2[] = implode(" ", $text_tmp);
		$text_tmp = array();
	}
}

// вычисляем кол-во слов для каждой части текста
$result_len = strlen($text_arr2[0]);
$result_num_words[0] = 1;
$part = 0;
foreach (array_slice($text_arr2, 1) as $word) {
	$word_len = strlen($word);
	if ($result_len + $word_len + $result_num_words[$part] > $n) {
		$part++;
		$result_len = $word_len;
		$result_num_words[$part] = 1;
		continue;
	}
	$result_len += $word_len;
	$result_num_words[$part]++;
}

// разбиваем текст на части
$result = array();
$offset = 0;
foreach ($result_num_words as $rnw) {
	$result[] = implode(" ", array_slice($text_arr2, $offset, $rnw));
	$offset += $rnw;
}

print_r($result);
 

Agent

Новичок
WBS, большое спасибо, но мне нужно делить не по словам, а по количеству символов. Допустим в первой части 400, а дальше все остальное.
 
Сверху