Вот набросал:
Должно розделить на 2 части.
Определить позицию обрыва строки с конца в первой части и с начала во второй.
По этому - определяем, какому блоку принадлежит часть текста что больше. Ну и соответственно делим
<?php
$text = 'aaa'.PHP_EOL.'bbbbb'.PHP_EOL.'ccccccc'.PHP_EOL.'dddd'.PHP_EOL.'eeeeeeeeeeeee'.PHP_EOL.'fff';
$length = strlen($text);
$half = (int) ($length / 2);
$part_1 = substr($text,0, $half);
$part_2 = substr($text,$half);
$eol_1 = strrpos( $part_1, PHP_EOL, 0); // last position from string start of first part
$eol_2 = $half + strpos( $part_2, PHP_EOL, 0 ); // first position from string start of second part
$shift_1 = $half - $eol_1; // char shift size till middle point of first block
$shift_2 = $eol_2 - $half; // char shift size till middle point of last block
if($shift_1 < $shift_2){ // PHP_EOL is closer to firts block, so larger size of block saved in second block
$part_1 = substr($text,0,$shift_1);
$part_2 = substr($text,$shift_1);
}else{
$part_1 = substr($text,0,$eol_1);
$part_2 = substr($text,$eol_1);
}
echo '<pre>';
var_dump( array(
'length' => $length,
'middle point' => $half,
'position of EOL of first block' => $eol_1,
'position of EOL of second block' => $half + $eol_2,
) );
var_dump( $part_1, $part_2 );
?>