Разбить длинную строку, не используя пробел - PullRequest
1 голос
/ 19 ноября 2011

Если у меня есть такие предложения:

$msg = "hello how are you?are you fine?thanks.."

, и я хочу разделить их на 3 (или любое другое число).

Итак, я делаюэто:

    $msglen = strlen($msg);
    $seperate = ($msglen /3);

    $a = 0;
    for($i=0;$i<3;$i++)
    {
     $seperate = substr($msg,$a,$seperate)

     $a = $a + $seperate;
    }

Таким образом, вывод должен быть ..

  1. hello how are
  2. [a space here->] you?are you [<-a space here]
  3. fine?thanks..

Так возможно ли отделить в середине любого слова вместо пробела перед или в конце разделенного сообщения?

Такие, как «спасибо» -> «чем» и «к вам» вместо «спасибо» «вам».Поскольку я выполняю функцию преобразования и с пробелом в начале или в конце она будет влиять на преобразование, и пространство необходимо для преобразования, поэтому я не могу игнорировать или удалять его.

Спасибо.

Ответы [ 4 ]

1 голос
/ 19 ноября 2011

Я так понимаю, вы не можете использовать обрезку, потому что сообщение, сформированное объединенными строками, должно быть неизменным?

Это может усложниться.Вы можете сделать что-то, что проверяет пробел после разделения, и, если обнаруживается пробел, делает разделение на один символ раньше.Довольно легко, но что, если у вас есть два пробела вместе?Или одно буквенное слово?Конечно, вы можете рекурсивно протестировать этот способ, но тогда вы можете получить разделенные строки длин, которые сильно отличаются друг от друга.

Вам необходимо правильно определить ограничения, для которых вы хотите, чтобы это функционировало.

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

РЕДАКТИРОВАТЬ: Затем, если вы не беспокоитесь о длине, вы могли бы сделать что-то вроде этого [начальныйс кодом 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: Кстати, вам было бы гораздо лучше каким-то образом изменить свой подход :) Я серьезно сомневаюсь, что вам действительно придется использовать такую ​​функцию впрактика.Ну ... надеюсь, у тебя действительно есть веская причина, было довольно забавно придумать это.

0 голосов
/ 19 ноября 2011

Вы, вероятно, ищете str_split, chunk_split или wordwrap.

0 голосов
/ 19 ноября 2011

Если вы хотите разбить строку на точные трети, неизвестно, где будет разрез, возможно одним словом, может быть между словами.

Ваш код может быть упрощен до:

$msg = "hello how are you?are you fine?thanks..";
$parts = str_split($msg, ceil(strlen($msg)/3));

Обратите внимание, что необходимо ceil(), иначе вы можете получить 4 элемента из-за округления.

0 голосов
/ 19 ноября 2011

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

...