Как лучше разделить текст на абзацы (убрать лишние переносы строк и оставить/добавить в нужных местах)?

Здравствуйте, многим, наверное, знакомо... когда копируете текст, например, с PDF или с какой-нибудь странички, где строго расставлены переносы и выглядит, примерно, так (можно не читать):

У меня пропал интерес к работе. Этот лист бумаги является плодом
тщетной попытки занять себя. Я не раскрыл здесь ничего такого, что
могло бы повредить Братству, именно поэтому, наверное, я еще жив.
Может быть, я этот лист уничтожу или отправлю на Луну, или ради
хохмы, чисто так отправлю к вам по почте и наложу на него хорошее
заклятье, чтобы, если оно не дойдет куда надо, виновник хлебнул,
почем фунт лиха.
У меня к вам просьба. Если это письмо не сгинет все-таки
бесследно, а дойдет до вас, то - напечатайте его в назидание или в
поучение, да просто чтобы люди, парни, девчонки прочли - не губите
себя, не занимайтесь магией, не давайте объявления типа
"отзовитесь, маги черные и белые". Вдруг кто-нибудь из Братства не
побрезгует и найдет вас, и вы ему подойдете, и он начнет учить вас
Этому... Живите себе тихо-спокойно, когда не из чего выбирать,
дорога впереди такая простая и ясная - дом, семья, работа, дети -
целых 70-80, а то и больше лет безмятежного существования.
Какое простое счастье - мне оно уже не суждено. Я разучился
любить, у меня нет родни, друзей, любимого дела - так зачем мне
тогда это бессмертие, которым по жизни меня наградило занятие
магией?
Когда это письмо дойдет до вас, я все равно уже в любом случае не
прочту его на ваших страницах, так как сегодня в подходящее время,
если я не ошибся в расчетах, мой голос перенесет меня в Мир
Безымянных. Если вдруг выйдет, я, может быть, и вернусь, но это
вряд ли - еще никто не возвращался оттуда.
Пусть ваша Дорога будет чистой.
ДАЙХАРД.


Написал скриптик, который делает так (можно не читать):

У меня пропал интерес к работе. Этот лист бумаги является плодом тщетной попытки занять себя. Я не раскрыл здесь ничего такого, что могло бы повредить Братству, именно поэтому, наверное, я еще жив. Может быть, я этот лист уничтожу или отправлю на Луну, или ради хохмы, чисто так отправлю к вам по почте и наложу на него хорошее заклятье, чтобы, если оно не дойдет куда надо, виновник хлебнул, почем фунт лиха.

У меня к вам просьба. Если это письмо не сгинет все-таки бесследно, а дойдет до вас, то - напечатайте его в назидание или в поучение, да просто чтобы люди, парни, девчонки прочли - не губите себя, не занимайтесь магией, не давайте объявления типа "отзовитесь, маги черные и белые". Вдруг кто-нибудь из Братства не побрезгует и найдет вас, и вы ему подойдете, и он начнет учить вас Этому... Живите себе тихо-спокойно, когда не из чего выбирать, дорога впереди такая простая и ясная - дом, семья, работа, дети - целых 70-80, а то и больше лет безмятежного существования. Какое простое счастье - мне оно уже не суждено. Я разучился любить, у меня нет родни, друзей, любимого дела - так зачем мне тогда это бессмертие, которым по жизни меня наградило занятие магией?

Когда это письмо дойдет до вас, я все равно уже в любом случае не прочту его на ваших страницах, так как сегодня в подходящее время, если я не ошибся в расчетах, мой голос перенесет меня в Мир Безымянных. Если вдруг выйдет, я, может быть, и вернусь, но это вряд ли - еще никто не возвращался оттуда.

Пусть ваша Дорога будет чистой.

ДАЙХАРД.


Сам скриптик:
$file_name = 'file.txt';
$file = file($file_name);

$arr = array_map(function($e){
	global $file;

	$avg = mb_strlen(implode(PHP_EOL, $file)) / count($file);
	$len = mb_strlen($e);
	$last_chr = mb_substr(trim($e), -1);

	$fdot = strstr($last_chr, '.') != false;
	$fexp = strstr($last_chr, '!') != false;
	$fqup = strstr($last_chr, '?') != false;

	if(($len < $avg) and ($fdot or $fexp or $fqup)){
		return $e."\r\n";
	}else{
		return str_replace(["\r\n", "\r", "\n"], " ", $e);
	}

}, $file);

$text = '';
foreach ($arr as $line){
	$text .= $line;
}


То есть я беру кол-во символов в каждой строке, считаю её среднее значение и, далее, если кол-во символов меньше среднего и последний символ - знак окончания предложения, то должен быть перенос, иначе без переноса.

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

Может кто-то уже сталкивался с похожей задачей, может у кого-то есть наработки или идеи, как можно мой скрипт улучшить?
  • Вопрос задан
  • 276 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы