Intereting Posts
Производительность PHP: $ this-> переменная и локальная переменная $ (манипуляция) чтение нескольких файлов CSV как сохранить ссылку встраивания youtube в базе данных MySQL LEFT JOIN запрос показывает то же значение Как подключить несколько баз данных в инфраструктуре phalcon в то же время использовать как в классе модели не только один Неустранимая ошибка: вызов неопределенной функции finfo_open () в php Автоматический чистый и удобный для SEO URL (slugs) Как определить, является ли выбранное изображение для загрузки допустимым? Перенос хэш из php's crypt () в python PHP: Как получить предыдущее воскресенье определенной даты в прошлом ..? PHP Json Encode PDO :: FETCH_ASSOC Регулярное выражение Получить адрес электронной почты с адреса электронной почты jQuery UI Datepicker реагирует только на первое текстовое поле Использование jQuery для отправки данных из multipart / form-data через ajax Как избежать неопределенного индекса

Разделить длинную строку, не используя пробел

Если у меня есть предложения вроде этого:

$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..

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

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

Благодарю.

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

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

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

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

EDIT: Затем, если вас не беспокоит длина, вы можете сделать что-то вроде этого [начиная с кода 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, если она вообще не может управлять разделом. Пожалуйста, тщательно протестируйте его.

EDIT2: Кстати, было бы намного лучше, если бы вы каким-то образом изменили свой подход 🙂 Я серьезно сомневаюсь, что на самом деле вам придется использовать такую ​​функцию на практике. Ну .. Надеюсь, у тебя действительно есть веские основания, это было весело.

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

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

Ваш код можно упростить до:

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

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

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