PHP: разбить строку на одинаковое количество символов, и если она слишком большая, найти последнюю \n и продолжить оттуда?

У меня есть строка, которая довольно длинная. Длина строки является переменной, а не статической. Вот почему мне нужно написать динамическую функцию для моей проблемы. Однако мне нужно разбить строку на равные большие размеры. Максимальный размер строки составляет 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.";

С уважением и спасибо!

Я думаю, вам было бы лучше использовать strpos поиск первого экземпляра /n, затем проверить, не меньше ли он вашей максимальной длины, а затем разделить его с помощью substr и зациклить эту процедуру до тех пор, пока строка не станет пустой, если я понимаю ваш вопрос правильно.

akaBase 25.03.2019 11:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
259
2

Ответы 2

поэтому я получил это, чтобы сделать то, что вы хотели:

$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 />, и это стало намного проще. Не уверен, что вы сможете изменить свою строку таким образом.

Я не думаю, что вы решаете вопрос.

Aniket Sahrawat 25.03.2019 12:12
$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?

Jan 25.03.2019 11:26

Я. Я прокомментировал код, надеюсь, так будет понятнее.

dearsina 25.03.2019 11:28

Но почему я получаю Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes), если я изменяю длину на 5, например. Это сообщение появляется только в том случае, если длина довольно мала!

Jan 25.03.2019 11:32

Я добавил отказоустойчивость, что происходит, так это то, что у вас есть куски, которые не содержат ни одного \n

dearsina 25.03.2019 11:33

Так много вычислительной мощности и все еще не правильное решение.

user7780894 25.03.2019 12:15

@roundAbout, пожалуйста, уточните. Или добавьте свой ответ. Есть много способов снять шкуру с этой кошки.

dearsina 25.03.2019 13:10

Привет, @dearsina, не могли бы вы попробовать это с фрагментом длиной 4000 и текстом, который делится на фрагменты 3 или более раз? Потому что я столкнулся с проблемой, что последний фрагмент не добавляется в массив фрагментов. И это всегда последние несколько слов, которые заканчиваются после разбивки текста..

Jan 26.03.2019 10:38

Другие вопросы по теме