Я так понимаю, вы не можете использовать обрезку, потому что сообщение, сформированное объединенными строками, должно быть неизменным?
Это может усложниться.Вы можете сделать что-то, что проверяет пробел после разделения, и, если обнаруживается пробел, делает разделение на один символ раньше.Довольно легко, но что, если у вас есть два пробела вместе?Или одно буквенное слово?Конечно, вы можете рекурсивно протестировать этот способ, но тогда вы можете получить разделенные строки длин, которые сильно отличаются друг от друга.
Вам необходимо правильно определить ограничения, для которых вы хотите, чтобы это функционировало.
Пожалуйста, укажите точно, что вы хотите сделать - хотите, чтобы каждый раздел был равен?Является ли разделение между словами более высокого приоритета, чем это, чтобы длины не имели большого значения?
РЕДАКТИРОВАТЬ: Затем, если вы не беспокоитесь о длине, вы могли бы сделать что-то вроде этого [начальныйс кодом Eriks и продолжая изменять длины, перемещаясь по пробелам:
$msg = "hello how are you?are you fine?thanks..";
$parts = split_without_spaces ($msg, 3);
function split_without_spaces ($msg, $parts) {
$parts = str_split(trim($msg), ceil(strlen($msg)/$parts));
/* Used trim above to make sure that there are no spaces at the start
and end of the message, we can't do anything about those spaces */
// Looping to (count($parts) - 1) becaause the last part will not need manipulation
for ($i = 0; $i < (count($parts) - 1) ; $i++ ) {
$k = $i + 1;
// Checking the last character of the split part and the first of the next part for a space
if (substr($parts[$i], -1) == ' ' || $parts[$k][0] == ' ') {
// If we move characters from the first part to the next:
$num1 = 1;
$len1 = strlen($parts[$i]);
// Searching for the last two consecutive non-space characters
while ($parts[$i][$len1 - $num1] == ' ' || $parts[$i][$len1 - $num1 - 1] == ' ') {
$num1++;
if ($len1 - $num1 - 2 < 0) return false;
}
// If we move characters from the next part to the first:
$num2 = 1;
$len2 = strlen($parts[$k]);
// Searching for the first two consecutive non-space characters
while ($parts[$k][$num2 - 1] == ' ' || $parts[$k][$num2] == ' ') {
$num2++;
if ($num2 >= $len2 - 1) return false;
}
// Compare to see what we can do to move the lowest no of characters
if ($num1 > $num2) {
$parts[$i] .= substr($parts[$k], 0, $num2);
$parts[$k] = substr($parts[$k], -1 * ($len2 - $num2));
}
else {
$parts[$k] = substr($parts[$i], -1 * ($num1)) . $parts[$k];
$parts[$i] = substr($parts[$i], 0, $len1 - $num1);
}
}
}
return ($parts);
}
Это касается нескольких пробелов и однобуквенных символов - однако, если они существуют, длины частей могут быть очень неравномерными.В крайних случаях он может быть испорчен - если у вас есть строка, состоящая в основном из пробелов, он может вернуть одну часть как пустую или вернуть false, если он вообще не может управлять разбиением.Пожалуйста, тщательно протестируйте.
РЕДАКТИРОВАТЬ2: Кстати, вам было бы гораздо лучше каким-то образом изменить свой подход :) Я серьезно сомневаюсь, что вам действительно придется использовать такую функцию впрактика.Ну ... надеюсь, у тебя действительно есть веская причина, было довольно забавно придумать это.