У меня есть строка, которая довольно длинная. Длина строки является переменной, а не статической. Вот почему мне нужно написать динамическую функцию для моей проблемы. Однако мне нужно разбить строку на равные большие размеры. Максимальный размер строки составляет 4096 символов.
На самом деле сделать это довольно просто:
$myArray = str_split($myMessage, 4096);
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу разделить строку после каждого символа 4096, но также сделать ее читаемой. Итак, что мне действительно нужно, так это функция, которая разбивает строку после 4096 символов, но затем возвращается к последнему разрыву строки (\n), а затем снова продолжает оттуда.
Итак, в конце у меня есть вполне читаемая строка, которая всегда разбивается на 4096 (если символ 4096 является \n) или последним \n.
Тем не менее, я уже гуглил, но не нашел решения. Не могли бы вы, ребята, помочь мне и дать мне подсказку, как решить эту проблему, потому что у меня действительно нет клея, как это решить.
Итак, вот пример того, что я хочу в конце с максимальной длиной char 5:
$myString = "Hey there.\nThis is a test.\nAnd this is\nhow it works."
[0] = "Hey there.\nThis is a test.\n"; //29 chars
[1] = "And this is\nhow it works.";
С уважением и спасибо!






поэтому я получил это, чтобы сделать то, что вы хотели:
$myString = "Hey there.<br />This is a test.<br />And this is<br />how it works.";
$array1 = str_split($myString, 30);
$array2 = explode('<br />', $array1[0]);
for($i=0; $i<count($array2); $i++){
echo $array2[$i].'<br />';
}
Проблема, с которой я столкнулся, заключалась в том, что строка в первую очередь пыталась найти \n. Я изменил это на <br />, и это стало намного проще. Не уверен, что вы сможете изменить свою строку таким образом.
Я не думаю, что вы решаете вопрос.
$string = "Hey there.\nThis is a test.\nAnd this is\nhow it works.";
//Your long string with \n
$len = 20;
//The longest length of each chunk
$needle = "\n";
//The character you want to split the strings by
while(strlen($string)>$len){
//as long as the string is longer than 1 chunk
$len_chunk = substr($string, 0, $len);
//cut away the first chunk
$string = substr($string, $len);
//keep the rest together
if (!strrpos($len_chunk, $needle)){
//in case the chunk doesn't contain a single \n character (! used instead of === FALSE by design)
$chunks[] = $len_chunk;
continue;
}
$chunks[] = substr($len_chunk, 0, strrpos($len_chunk, $needle));
//trim away the stuff after the *last* \n
$string = substr($len_chunk, strrpos($len_chunk, $needle)) . $string;
//Attach the rest back to the original string
}
$chunks[] = $string;
//Add whatever is remaining in the string as the last chunk!
var_dump($chunks);
Выход:
array(4) {
[0]=>
string(10) "Hey there."
[1]=>
string(16) "
This is a test."
[2]=>
string(12) "
And this is"
[3]=>
string(14) "
how it works."
}
В коде на данный момент \n стоит первый в каждой последующей строке после первой. Его можно легко изменить на символ прошлой строки охвата или полностью удалить.
Я получаю Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes). А также, где мой массив? Это переменная $chunks?
Я. Я прокомментировал код, надеюсь, так будет понятнее.
Но почему я получаю Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes), если я изменяю длину на 5, например. Это сообщение появляется только в том случае, если длина довольно мала!
Я добавил отказоустойчивость, что происходит, так это то, что у вас есть куски, которые не содержат ни одного \n
Так много вычислительной мощности и все еще не правильное решение.
@roundAbout, пожалуйста, уточните. Или добавьте свой ответ. Есть много способов снять шкуру с этой кошки.
Привет, @dearsina, не могли бы вы попробовать это с фрагментом длиной 4000 и текстом, который делится на фрагменты 3 или более раз? Потому что я столкнулся с проблемой, что последний фрагмент не добавляется в массив фрагментов. И это всегда последние несколько слов, которые заканчиваются после разбивки текста..
Я думаю, вам было бы лучше использовать
strposпоиск первого экземпляра/n, затем проверить, не меньше ли он вашей максимальной длины, а затем разделить его с помощьюsubstrи зациклить эту процедуру до тех пор, пока строка не станет пустой, если я понимаю ваш вопрос правильно.